[geos-devel] Swig Update and questions

Charlie Savage cfis at savagexi.com
Sat Jun 24 22:10:23 EDT 2006


Thanks for the info Sean.

If the swig bindings used the C api and did the same check for the geom 
type, would there be any difference between them and the Python 
bindings?  Are they any specific python features you added to them to 
make them easier to use from Python?  Anything that couldn't be done in 
SWIG?  Just wondering if we can combine efforts here.

Charlie

Sean Gillies wrote:
> 
> On Jun 24, 2006, at 6:02 PM, Charlie Savage wrote:
> 
>>> We surely want them distributed. We also want to distribute the 
>>> generated
>>> wrapper (for those not having unstable swig installed).
>>> Would be nice if make maintainer-clean would get rid of the latter
>>> and next make would recreate it.
>>> (haven't tested your new makefiles yet)
>>
>> Okay, so I need to add in a hook for make maintainer-clean then and to 
>> have make check to see if the generated wrapper exists or not and 
>> create if needed (I think the makefiles already do that actually).
>>
>> Anything I need to do for getting the files into the distribution?
>>
>> Haven't checked in my changes yet, I want to first test them some more.
>>
>>>> * Who owns the geometries returned from methods such as 
>>>> Intersection, Difference, etc?  The C API doesn't give any 
>>>> indication and it wasn't obvious to me looking through the C++ code.
>>> A rule of thumb for the C API is:
>>> Every Geometry caller should take care of is returned
>>> as a non-const object.
>>> For these specific case the caller must delete them.
>>
>> Okay, so the caller needs to delete the results of methods like 
>> Intersection.  Assumedly the same goes for using the C++ api - i.e, 
>> geom->intersects(someOtherGeom)?
>>
>>
>> While on the subject, I've taken a look at what would be involved with 
>> having the SWIG wrappers use the C api.  Its doable - basically I 
>> would have SWIG create "fake classes" which look like classes to 
>> Ruby/Python but underneath use the C API.  This is how the GDAL swig 
>> bindings are implemented, so its ok.  It is a bit silly (duplicate 
>> definitions), but it works.
>>
>> But the thing that holds me back is that in the c-api all the geometry 
>> types get merged into just Geometry (no points, linestrings, etc.). 
>> That might be ok for C, but me would seem very strange in Ruby or 
>> Python.  I've thought its too high too high a price to pay and thus
>>
>> But I wonder if there is a way around this by using a variation of the 
>> PIMPL idiom (http://www.gotw.ca/publications/mill05.htm)?
>>
>> Something like forward declare all the Geos geometry classes, but of 
>> course don't call any methods on them.  Then for any C-API method that 
>> returns a geometry do a dynamic_cast to see what it is and then return 
>> an appropriate SWIG wrapper classes.
>>
>> Sean or Hobu - didn't one of you write your own bindings for Python 
>> not using SWIG?  How did you handle this?  Are you happy with just 
>> having a Geometry object and you have to make sure to use it correctly 
>> (if its a point don't call NumRings)?  Or did you do something more 
>> clever?
>>
> 
> Charlie,
> 
> I'm doing something similar to your idea above. When a generic geometry 
> is returned from a method, I check the GEOS type and then change the 
> class of the result object to Point, LineString, etc.
> 
> 
>> In the end though I wonder if there is any real benefit to using the C 
>> api for the swig bindings. The c-api is supposed to insulate a program 
>> from changes to the underlying C++ api.  But the bindings libraries 
>> already do that.  Python/Ruby will dynamically load the bindings and 
>> install the appropriate classes/methods.
>>
>> That means can install a new version of GEOS, swap out the bindings 
>> library, restart your program, and all should be well as long as you 
>> haven't removed any methods (it doesn't matter if methods or classes 
>> or changed namespaces or changed hearder files or whatever).  Now if 
>> you swapped out the version of GEOS and not the bindings, then you'd 
>> run into problems (but you would also with the C-API).
>>
>> There is also the point that everything is statically linked on 
>> Windows  (since geos doesn't export any functions), so it doesn't 
>> matter at all if the version of geos is changed on the machine.  You 
>> could do the same on Linux/Unix I suppose.
>>
>> Well, after all that rambling I've talked myself back into the idea 
>> that the SWIG bindings should stick with the C++ api because the C api 
>> provides no forward compatibility benefit (it does provide benefit, or 
>> disadvantage depending on your viewpoint, of a much smaller API).  But 
>> I'm more than happy to listen to counter arguments and do the work to 
>> switch over to the C api if its demonstrably better.
>>
>> Charlie
>> _______________________________________________
>> geos-devel mailing list
>> geos-devel at geos.refractions.net
>> http://geos.refractions.net/mailman/listinfo/geos-devel
> 
> ---
> Sean Gillies
> http://zcologia.com
> 
> 
> 
> _______________________________________________
> geos-devel mailing list
> geos-devel at geos.refractions.net
> http://geos.refractions.net/mailman/listinfo/geos-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3237 bytes
Desc: S/MIME Cryptographic Signature
Url : http://lists.osgeo.org/pipermail/geos-devel/attachments/20060624/bae627a7/smime.bin


More information about the geos-devel mailing list