Answers below

P.S. : Don't forget to use 'Answer to all' when answering to a post so that the list is CC'ed

----- Original Message ----- From: "Stefan Moebius" <[email protected]>
To: "Even Rouault" <[email protected]>
Sent: Friday, August 07, 2009 11:45 AM
Subject: Re: [gdal-dev] Question on OGR handle types


Even,

Thanks for your reply.

No we aren't actually afraid to use casts, we were just wondering what the point is in changing the GDAL sources to improve type safety, just to tell users to use not-really-type safe casts?

That depends on the point of view. The change to turn all "type void* foo" into something more specific enabled us to discover bugs in code using the C API in a few places inside GDAL itself as all C handles were equivalent before.


> For the C++ part, we could argue there's a lack of a static void
> OGRCoordinateTransformation::Destroy(OGRCoordinateTransformation*) > method
> to avoid using the delete operator, which can be an issue on Windows.

Yes, that's exactly what we do argue ;-)
(The pure-C way is not an option in our case.)

Would it make sense for us to come up with a patch for adding this function?

Patch welcome. Please post it as an attachement to a ticket in GDAL Trac. It should be done against svn trunk code ideally.


Cheers,
Stefan

Even Rouault wrote:
Stefan,

Why are you so much afraid about using cast ? ;-) This is probably the
easiest solution for you :
OGRCoordinateTransformation* poCT =
OGRCreateCoordinateTransformation(poSRS1, poSRS2);
OCTDestroyCoordinateTransformation( (OGRCoordinateTransformationH) poCT);

No worry to have. It's exactly the kind of casts done in GDAL/OGR C API
wrappers to call the C++ API.
For example :

OGRCoordinateTransformationH CPL_STDCALL OCTNewCoordinateTransformation(
 OGRSpatialReferenceH hSourceSRS, OGRSpatialReferenceH hTargetSRS )
{
 return (OGRCoordinateTransformationH)
OGRCreateCoordinateTransformation( (OGRSpatialReference *) hSourceSRS,
(OGRSpatialReference *) hTargetSRS );
}

void CPL_STDCALL OCTDestroyCoordinateTransformation(
OGRCoordinateTransformationH hCT )
{
 delete (OGRCoordinateTransformation *) hCT;
}

Otherwise, as you've noted, the stricter typing is only enforced when DEBUG
is defined.
So your code should compile without any change if you don't define DEBUG.

The fundamental issue in fact is that you're mixing use of C++ API and C
API.
A pure C solution would be to use the pair
OCTNewCoordinateTransformation()/OCTDestroyCoordinateTransformation().
For the C++ part, we could argue there's a lack of a static void
OGRCoordinateTransformation::Destroy(OGRCoordinateTransformation*) method
to avoid using the delete operator, which can be an issue on Windows.

----- Original Message ----- From: "Stefan Moebius" <[email protected]>
To: <[email protected]>
Sent: Wednesday, August 05, 2009 5:59 PM
Subject: [gdal-dev] Question on OGR handle types


Hi,

In May 2008, a couple of changes where made to improve type checking.

See http://lists.osgeo.org/pipermail/gdal-dev/2008-May/017059.html
http://trac.osgeo.org/gdal/changeset/14435
http://trac.osgeo.org/gdal/changeset/14441

Our code is using the function

OGRCoordinateTransformation* OGRCreateCoordinateTransformation
(OGRSpatialReference * poSource,
OGRSpatialReference * poTarget)

and with the upgrade from 1.5 to 1.6, we now cannot properly destroy the OGRCoordinateTransformation anymore (at least in debug mode).

The documentation of that create function says:

Create transformation object.

This is the same as the C function OCTNewCoordinateTransformation().

Input spatial reference system objects are assigned by copy (calling clone() method) and no ownership transfer occurs.

The delete operator, or OCTDestroyCoordinateTransformation() should be used to destroy transformation objects.

As we are linking the GDAL dynamically, using delete is not really an option as we cannot predict what heap was used to create the object. The destroy function, however, requires a parameter of type OGRCoordinateTransformationH, which we cannot cleanly cast to anymore for that change mentioned at the beginning.

What are we missing here? How is this supposed to be used?

Any help is appreciated.

Regards,
Stefan

--
Stefan Möbius
Development Manager

Actix GmbH
Altmarkt 10
01067 Dresden
Germany

T +49 351 40429 17
www.actix.com




_______________________________________________
gdal-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to