Source code for cellcomplex.utils.id_dict

# -*- python -*-
# -*- coding: utf-8 -*-
#
#       IdDict : container package
#
#       Copyright  or Copr. 2006 INRIA - CIRAD - INRA
#
#       File author(s): Jerome Chopard <jerome.chopard@sophia.inria.fr>
#
#       Distributed under the Cecill-C License.
#       See accompanying file LICENSE.txt or copy at
#           http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html
#
#       VPlants WebSite : https://gforge.inria.fr/projects/vplants/
#

__doc__="""
This module provide a dictionnary that create keys when needed
"""

__license__= "Cecill-C"
__revision__=" $Id$ "

from .id_generator import IdMaxGenerator,IdSetGenerator,IdListGenerator

IdGen = {"max":IdMaxGenerator,
         "set":IdSetGenerator,
         "list":IdListGenerator}

[docs]class IdDict (dict) : """ store a tuple of (id,elm) create an id when needed """ def __init__ (self, *args, **kwdargs) : try : gen_name = kwdargs.pop("idgenerator") except KeyError : gen_name = "set" dict.__init__(self,*args,**kwdargs) self._gen_id_generator(gen_name) for k,v in self.items() : self._id_generator.get_id(k) def _gen_id_generator(self, gen_name = 'set'): try : self._id_generator=IdGen[gen_name]() except KeyError : raise UserWarning("the required id generator (%s) is unknown,\navailable generator are %s" % (gen_name,str(IdGen.keys())) )
[docs] def get_generator_type(self): for name, typevalue in IdGen.items(): if type(self._id_generator) == typevalue: return name
[docs] def add (self, val, key=None) : try : key=self._id_generator.get_id(key) dict.__setitem__(self,key,val) return key except IndexError : raise KeyError(key)
def __deepcopy__(self, memo): from copy import deepcopy newval = IdDict(idgenerator=self.get_generator_type()) for key,val in self.items(): dict.__setitem__(newval,deepcopy(key,memo),deepcopy(val,memo)) newval._id_generator = deepcopy(self._id_generator,memo) return newval
[docs] def enable_id_reuse(self, enabled = True): self._id_generator.enable_id_reuse(enabled)
[docs] def id_reuse_enabled(self): return self._id_generator.id_reuse_enabled()
################################################ # # dict interface # ################################################ def __delitem__ (self, key) : dict.__delitem__(self,key) self._id_generator.release_id(key) def __setitem__ (self, key, val) : if key not in self : if not hasattr(self,'_id_generator') : self._gen_id_generator() self._id_generator.get_id(key) dict.__setitem__(self,key,val)
[docs] def clear (self) : dict.clear(self) self._id_generator.clear()
[docs] def copy (self) : return IdDict(self)
[docs] def pop (self, key, *args) : try : val=dict.pop(self,key) self._id_generator.release_id(key) return val except KeyError : if len(args)>0 : return args[0] else : raise
[docs] def popitem (self) : key,val=dict.popitem(self) self._id_generator.release_id(key) return key,val
[docs] def setdefault (self, key, *args) : if key not in self : self._id_generator.get_id(key) return dict.setdefault(key,*args)
[docs] def update (self, E, **F) : raise NotImplementedError("lapin compris")