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)
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