<div dir="ltr">Scratch my enum comment...<div><br></div><div><a href="http://stackoverflow.com/questions/1448396/how-to-use-enums-as-flags-in-c">http://stackoverflow.com/questions/1448396/how-to-use-enums-as-flags-in-c</a></div><div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 11, 2016 at 8:31 AM, Even Rouault <span dir="ltr"><<a href="mailto:even.rouault@spatialys.com" target="_blank">even.rouault@spatialys.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span class="">Le lundi 11 juillet 2016 17:11:59, Kurt Schwehr a écrit :<br>
> Even,<br>
><br>
> I think this looks good and a big win for a lot of use cases.<br>
><br>
> Comments related to the flags defined in gcore/gdal.h:<br>
><br>
> - If possible, use an enum rather than bare defines.<br>
<br>
</span>They are flags that can be OR'ed, so you cannot really define an enumeration. Or<br>
am I missing something ?<br>
<span class=""><br>
<br>
> - Add comments to gdal.h explaining what the values are<br>
</span>Yep, will do<br>
<span class=""><br>
> - Should an unimplemented also have the _DATA flag set rather than _EMPTY?<br>
<br>
</span>Yes, this is the case of the default GDALRasterBand::IGetDataCoverageStatus().<br>
I should also mention it in the doc that a driver that would implement the<br>
method, but in some cases would want to return _UNIMPLEMENTED should also set<br>
_DATA.<br>
<br>
><br>
> A suggestion for this<br>
> <<a href="https://github.com/OSGeo/gdal/compare/trunk...rouault:sparse_datasets?expa" rel="noreferrer" target="_blank">https://github.com/OSGeo/gdal/compare/trunk...rouault:sparse_datasets?expa</a><br>
> nd=1#diff-66f7e256611c32cddc2745d78b4fe59bR3787>, which looks brittle to<br>
<span class="">> me:<br>
><br>
>      if( nStatus != GDAL_DATA_COVERAGE_STATUS_EMPTY )<br>
><br>
> A helper function to check empty rather than a direct check will allow for<br>
> later or'ing the status with other flags.  Or you can & with the flag.  But<br>
> looking at it a second time, I think it might be more explicit if you did a<br>
> check against having data:<br>
><br>
>     if( nStatus & GDAL_DATA_COVERAGE_STATUS_DATA )<br>
<br>
</span>Yes, that's probably better (assuming that _unimplemented comes with _data<br>
set)<br>
<br>
Thanks<br>
<div class=""><div class="h5"><br>
><br>
> -kurt<br>
><br>
> On Sun, Jul 10, 2016 at 2:54 AM, Even Rouault <<a href="mailto:even.rouault@spatialys.com">even.rouault@spatialys.com</a>><br>
><br>
> wrote:<br>
> > Le dimanche 10 juillet 2016 11:32:48, Andrew C Aitchison a écrit :<br>
> > > On Fri, 8 Jul 2016, Even Rouault wrote:<br>
> > > > The topic of sparse dataset management come back regularly, so I've<br>
> > > > decided to tackle it.<br>
> > > ><br>
> > > > Please find<br>
> > > > <a href="https://trac.osgeo.org/gdal/wiki/rfc63_sparse_datasets_improvements" rel="noreferrer" target="_blank">https://trac.osgeo.org/gdal/wiki/rfc63_sparse_datasets_improvements</a><br>
> ><br>
> > for<br>
> ><br>
> > > > review.<br>
> > ><br>
> > > I know of several proprietary file formats where the data is tiled<br>
> > > with the index indicating (perhaps implicitly) where the tile has no<br>
> > > data.<br>
> > ><br>
> > > A driver for such formats could have IReadBlock quickly return with<br>
> > > a code to indicate NoData, rather than filling in the image data.<br>
> > > As it stands that might mean extending CPLErr, but would<br>
> > > that be helpful to the main library ?<br>
> ><br>
> > That would have a significant impact on the whole code base, as well as<br>
> > application code, so I didn't really considered that option and prefered<br>
> > an auxiliary interface to be used by code aware and caring about special<br>
> > behaviour for sparse datasets.<br>
> ><br>
> > > Is this what is described by having the offset and byte count both zero<br>
> > > ?<br>
> ><br>
> > Yes, in TIFF, you have 2 arrays, one that indicates at which offset in<br>
> > the file<br>
> > a given tile/strip is located, and the other one for the number of bytes<br>
> > of that tile/strip. GDAL uses offset = count = 0 as a convention for<br>
> > missing blocks.<br>
> ><br>
> > > ----<br>
> > ><br>
> > > I don't really understand how GDAL_DATA_COVERAGE_STATUS values combine<br>
> > > or<br>
> ><br>
> > * If the requested window contains has no missing blocks, it returns<br>
> > GDAL_DATA_COVERAGE_STATUS_DATA<br>
> > * If the requested window has only missing blocks, it returns<br>
> > GDAL_DATA_COVERAGE_STATUS_EMPTY<br>
> > * If the requested window is a mix of both, it returns<br>
> > GDAL_DATA_COVERAGE_STATUS_DATA | GDAL_DATA_COVERAGE_STATUS_EMPTY<br>
> ><br>
> > > when pdfDataPct is valid.<br>
> ><br>
> > It should be valid if the processing has not been stopped prematurely due<br>
> > to<br>
> > the nMaskFlagStop being triggered. For example if you have a dataset and<br>
> > you<br>
> > want a special processing (could be just an info "This dataset is<br>
> > sparse") as<br>
> > soon as it contains empty blocks, then you can query the whole dataset<br>
> > extent<br>
> > with nMaskFlagStop = GDAL_DATA_COVERAGE_STATUS_EMPTY. As soon as a<br>
> > missing block is found, the function will exit, and will thus be unable<br>
> > to determine<br>
> > the percentage of valid data.<br>
> ><br>
> > > In one of the formats above, the tile index has special values<br>
> > > for "no data" and and for "data exists and could be retrieved/purchased<br>
> > > if required". I'd consider mapping these to<br>
> ><br>
> > GDAL_DATA_COVERAGE_STATUS_EMPTY<br>
> ><br>
> > Clearly a missing block will cause GDAL_DATA_COVERAGE_STATUS_EMPTY to be<br>
> > set.<br>
> ><br>
> > > and GDAL_DATA_COVERAGE_STATUS_UNIMPLEMENTED. Does that make sense ?<br>
> ><br>
> > GDAL_DATA_COVERAGE_STATUS_UNIMPLEMENTED is aimed at being returned when a<br>
> > driver does not offer an implementation of the interface, and thus uses<br>
> > the default dumb implementation that returns<br>
> > GDAL_DATA_COVERAGE_STATUS_UNIMPLEMENTED<br>
> ><br>
> > I realize that I didn't really document yet the semantics of those flags.<br>
> > To be<br>
> > done.<br>
> ><br>
> ><br>
> > --<br>
> > Spatialys - Geospatial professional services<br>
> > <a href="http://www.spatialys.com" rel="noreferrer" target="_blank">http://www.spatialys.com</a><br>
> > _______________________________________________<br>
> > gdal-dev mailing list<br>
> > <a href="mailto:gdal-dev@lists.osgeo.org">gdal-dev@lists.osgeo.org</a><br>
> > <a href="http://lists.osgeo.org/mailman/listinfo/gdal-dev" rel="noreferrer" target="_blank">http://lists.osgeo.org/mailman/listinfo/gdal-dev</a><br>
<br>
--<br>
Spatialys - Geospatial professional services<br>
<a href="http://www.spatialys.com" rel="noreferrer" target="_blank">http://www.spatialys.com</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">--<div><a href="http://schwehr.org" target="_blank">http://schwehr.org</a></div></div>
</div></div></div>