diff options
Diffstat (limited to 'intern/python/modules/mcf/utils/singletonlist.py')
-rw-r--r-- | intern/python/modules/mcf/utils/singletonlist.py | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/intern/python/modules/mcf/utils/singletonlist.py b/intern/python/modules/mcf/utils/singletonlist.py new file mode 100644 index 00000000000..5ca2f5000c2 --- /dev/null +++ b/intern/python/modules/mcf/utils/singletonlist.py @@ -0,0 +1,104 @@ +class SingletonList: + ''' + A SingletonList always has a length of one or 0, + appends overwrite the single element, iteration will + return precisely one element. Attempts to get any item + other than 0 will raise an IndexError or return the single + item depending on whether the 'raiseIndexError' flag is + true or false (generally it should be true except if the + for x in SingletonList: construct is known never to be + used, since this construct will create an infinite loop + if we never raise an IndexError). + ''' + def __init__(self,base=None,raiseIndexError=1): + self._base = base + self.raiseIndexError = raiseIndexError + def __len__(self): + ''' + The length is 0 if no _base, 1 if a base + ''' + if hasattr(self, '_base'): + return 1 + else: + return 0 + def __getitem__(self,ind): + ''' + Get the item if ind == 0, else raise an IndexError or return + the item, depending on the raiseIndexError flag + ''' + if ind == 0: + try: + return self._base + except AttributeError: + raise IndexError, ind + elif self.raiseIndexError: + raise IndexError, ind + else: + return self._base + def __setitem__(self,ind, item): + ''' + The item is to become the base + ''' + self._base = item + def __delitem__(self,ind): + ''' + Delete the base, regardless of the index used + ''' + try: + del(self._base) + except AttributeError: + raise IndexError, ind + def append(self,item): + ''' + Replace the base with the item + ''' + self._base = item + def index(self,item): + ''' + if the item is the base, return the only valid index (0) + ''' + try: + if item == self._base: + return 0 + except: + pass + raise ValueError, item + def count(self, item): + ''' + If the item is the base, we have one, else 0 + ''' + try: + if item == self._base: + return 1 + except: + pass + return 0 + insert = __setitem__ + def remove(self, item): + ''' + if the item is the base, delete the base, else ValueError + ''' + try: + if item == self._base: + del(self._base) + return + except: + pass + raise ValueError, item + def reverse(self): + pass + def sort(self): + pass + def __repr__(self): + try: + return '[%s]'%`self._base` + except AttributeError: + return '[]' + # store and copy functions +# def __getinitargs__(self): +# return (self._base,self.raiseIndexError) +# def __getstate__(self,*args,**namedargs): +# pass +# def __setstate__(self,*args,**namedargs): +# pass + |