[gdal-dev] Minimum supported C and C++ standards
Kurt Schwehr
schwehr at gmail.com
Sat May 7 10:10:23 PDT 2016
This is example demonstrates that we are in-general fighting hard against
C++... up-hill both ways in a blizzard. :) This is why starting with zero
features and working our way up with a white list gives examples of correct
usage. It looks like a lot of GDAL development happens by
copy-paste-tweak, so good examples are key. And for every issue, we have
solutions that are valid C/C++03/C++11/C++14... the best solution is not
necessarily in any particular one.
> If we move to a later C++ standard, or even use features of C++98 we
> currently
> don't use, I'd advocate for using things that are obviously making the code
> better / more readable. Honestly who finds that
> "std::unique_ptr<int *, std::function<void(char *)>> Vals(CPLCalloc(256,
> 0),
> CPLFree);" is obviously more readable, efficient and less error prone than
> "std::vector Vals(256,0)" ?
>
>
This is cart before the horse but... as fast as I can so expect typos. Now
just think of a ~1K long function or method with tons of instances and lots
of places to bailout successfully or as failures. We have > 9K
free/CPLFree/CPLdelete/CPLDestroys that could be < ~100.
GDALMyBigObj *poInstance = CPLCalloc(sizeof(GDALMyBigObj);
...
if (oops) {
CPLDelete(poInstance)
return;
}
...
return; // kaboom
...
if (oops) {
CPLDelete(poInstance)
return;
}
...
if (oops) {
CPLDelete(poInstance)
return;
}
CPLDelete(poInstance)
return;
or worse
GDALMyBigObj *poInstance = CPLCalloc(sizeof(GDALMyBigObj);
...
if (oops) {
goto END;
}
...
// Careful what you do here because you are crossing gotos.
...
if (oops) {
goto END;
}
...
if (oops) {
goto END;
}
...
END:
CPLDelete(poInstance)
return;
when you could have... And yes, getting to this is not trivial. There are
multiple things here to discuss:
auto poInstance = std::make_unique<GDALMyBigObj>(arg1, arg2, arg3);
if(oops)
return; // Everything cleaned up nice
...
if(oops)
return; // Everything cleaned up nice
...
if(oops)
return; // Everything cleaned up nice
...
return; // Woohoo! Success!
My example of the deleter comes from real code where I don't what a heap
checker barfing at me when ever a test fails. Makes writing and debugging
tests insane....
// Apache 2.0 license...
{
// ...
unique_ptr<OGRFeature> feature(layer->GetNextFeature());
OGRGeometry *geometry = feature->GetGeometryRef();
ASSERT_NE(nullptr, geometry);
char *wkt_tmp = nullptr;
ASSERT_EQ(OGRERR_NONE, geometry->exportToWkt(&wkt_tmp));
std::unique_ptr<char, CplFreeDeleter> wkt(wkt_tmp);
wkt_tmp = nullptr;
ASSERT_STREQ("POINT (-109.27 10.3)", wkt.get());
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20160507/a01e0230/attachment.html>
More information about the gdal-dev
mailing list