• Main Page
  • Namespaces
  • Classes
  • Files
  • File List

/home/mark/model/software/ScrumPy/ScrumPy/LP/Array.py

00001 import exceptions
00002 
00003 
00004 class BaseArray:
00005     """ Base class for arrays.
00006         Pythonesque interface to low level swig/c arrays.
00007         Subclasses must provide:
00008             _new(size)   => new array
00009             _get(index)  => array[index]
00010             _cast(value) => type(_cast(value)) == type(array[i]) | exception
00011             _set(index,value) => array[index] == _cast(value)
00012             _del(array)  => free array
00013 
00014         array is assumed to have a 1 offset index, and BaseArray provides mapping
00015         from the more usual python [0..size-1] <> [1..size]
00016 
00017         BaseArray (not the subclass) is responsible for array bound and
00018         other sanity checks, except for _cast which should raise exceptions.ValueError
00019         if type conversion not possible.
00020 
00021     """
00022     
00023     def _NotImplemented(BaseArray, *a, **k):
00024         raise exceptions.NotImplementedError
00025     
00026     _new  = _NotImplemented
00027     _get  = _NotImplemented
00028     _cast = _NotImplemented
00029     _set  = _NotImplemented
00030     _del  = _NotImplemented
00031 
00032     _offset=1
00033     
00034     
00035     def __init__(self,SizeOrList):
00036         if type(SizeOrList) == int:
00037             self.size = SizeOrList
00038             self._array = self._new(self.size+self._offset)
00039         else:
00040             self.FromList(SizeOrList)
00041 
00042     def __idx_check__(self,i):
00043         if i <self._offset or i>self.size+self._offset:
00044             raise exceptions.IndexError
00045 
00046     def __getitem__(self, i):
00047         i+=self._offset
00048         self.__idx_check__(i)
00049         return self._get(self._array,i)
00050 
00051     def __setitem__(self, i, v):
00052         i+=self._offset
00053         self.__idx_check__(i)
00054         v = self._cast(v)
00055         return self._set(self._array,i,v)
00056 
00057     def __del__(self):
00058         self._del(self._array)
00059 
00060     def __len__(self):
00061         return self.size
00062 
00063     def ToList(self):
00064         rv = []
00065         for i in range(self.size):
00066             rv.append(self[i])
00067         return rv
00068 
00069     def FromList(self,l):
00070         l = map(self._cast,l)  # if can't cast l, leave self unchanged
00071         if hasattr(self, "_array"):
00072             self._del(self._array)
00073         self.size = len(l)
00074         self._array = self._new(self.size+self._offset)
00075         for i in range(self.size):
00076             self[i] = l[i]
00077 
00078     def __repr__(self):
00079         return repr(self.ToList())
00080 
00081     def __str__(self):
00082         return str(self.ToList())
00083 
00084 
00085 

Generated on Tue Sep 4 2012 15:38:01 for ScrumPy by  doxygen 1.7.1