web/lib/django/contrib/gis/geos/base.py
changeset 0 0d40e90630ef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/django/contrib/gis/geos/base.py	Wed Jan 20 00:34:04 2010 +0100
@@ -0,0 +1,52 @@
+from ctypes import c_void_p
+from types import NoneType
+from django.contrib.gis.geos.error import GEOSException, GEOSIndexError
+
+# Trying to import GDAL libraries, if available.  Have to place in
+# try/except since this package may be used outside GeoDjango.
+try:
+    from django.contrib.gis import gdal
+except ImportError:
+    # A 'dummy' gdal module.
+    class GDALInfo(object):
+        HAS_GDAL = False
+        GEOJSON = False
+    gdal = GDALInfo()
+
+# NumPy supported?
+try:
+    import numpy
+except ImportError:
+    numpy = False
+
+class GEOSBase(object):
+    """
+    Base object for GEOS objects that has a pointer access property
+    that controls access to the underlying C pointer.
+    """
+    # Initially the pointer is NULL.
+    _ptr = None
+
+    # Default allowed pointer type.
+    ptr_type = c_void_p
+
+    # Pointer access property.
+    def _get_ptr(self):
+        # Raise an exception if the pointer isn't valid don't
+        # want to be passing NULL pointers to routines --
+        # that's very bad.
+        if self._ptr: return self._ptr
+        else: raise GEOSException('NULL GEOS %s pointer encountered.' % self.__class__.__name__)
+
+    def _set_ptr(self, ptr):
+        # Only allow the pointer to be set with pointers of the
+        # compatible type or None (NULL).
+        if isinstance(ptr, (self.ptr_type, NoneType)):
+            self._ptr = ptr
+        else:
+            raise TypeError('Incompatible pointer type')
+
+    # Property for controlling access to the GEOS object pointers.  Using
+    # this raises an exception when the pointer is NULL, thus preventing
+    # the C library from attempting to access an invalid memory location.
+    ptr = property(_get_ptr, _set_ptr)