Source code for cellcomplex.utils.id_generator
# -*- python -*-
# -*- coding: utf-8 -*-
#
# IdGenerator : graph package
#
# Copyright or Copr. 2006 INRIA - CIRAD - INRA
#
# File author(s): Jerome Chopard <jerome.chopard@sophia.inria.fr>
# Fred Theveny <theveny@cirad.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 generator for id numbers
"""
__license__= "Cecill-C"
__revision__=" $Id$ "
[docs]class IdMaxGenerator(object) :
def __init__ (self) :
self.clear()
[docs] def get_id (self, id = None) :
if id is None :
ret = self._id_max
self._id_max += 1
return ret
else : #Next two lines commented out by ML Walker because they interfere with graph development.
#if id < self._id_max :
#raise IndexError("id %d already used" % id)
self._id_max = max(self._id_max,id+1)
return id
[docs] def release_id (self, id) :
pass
[docs] def clear (self) :
""" Reset the generator.
"""
self._id_max = 0
[docs] def enable_id_reuse(self, enabled = True) :
pass
[docs] def id_reuse_enabled(self):
return False
[docs]class IdSetGenerator(object) :
def __init__ (self) :
self.clear()
[docs] def get_id (self, id = None) :
if id is None :
if len(self._available_ids) == 0 or not self.reuse_enabled:
ret = self._id_max
self._id_max += 1
return ret
else :
return self._available_ids.pop()
else :
if id >= self._id_max :
self._available_ids.update(range(self._id_max,id))
self._id_max = id+1
return id
else :
try :
self._available_ids.remove(id)
return id
except KeyError :
raise IndexError("id %d already used" % id)
[docs] def release_id (self, id) :
if id > self._id_max :
raise IndexError("id out of range")
elif id in self._available_ids :
raise IndexError("id already not used")
else :
self._available_ids.add(id)
[docs] def clear (self) :
""" Reset the generator.
"""
self._id_max = 0
self._available_ids = set()
self.reuse_enabled = True
[docs] def enable_id_reuse(self, enabled = True) :
self.reuse_enabled = enabled
[docs] def id_reuse_enabled(self):
return self.reuse_enabled
[docs]class IdGenerator (IdSetGenerator) :
pass
[docs]class IdListGenerator(object) :
def __init__ (self) :
self.clear()
[docs] def get_id (self, id=None) :
if id is None :
if len(self._id_list)==0 or not self.reuse_enabled:
ret=self._id_max
self._id_max+=1
return ret
else :
return self._id_list.pop()
else :
if id>=self._id_max :
self._id_list.extend(list(range(self._id_max,id)))
self._id_max=id+1
return id
else :
try :
ind=self._id_list.index(id)
del self._id_list[ind]
return id
except ValueError :
raise IndexError("id %d already used" % id)
[docs] def release_id (self, id) :
if id>self._id_max :
raise IndexError("id out of range")
elif id in self._id_list :
raise IndexError("id already not used")
else :
self._id_list.append(id)
[docs] def clear (self) :
self._id_max=0
self._id_list=[]
self.reuse_enabled = True
[docs] def enable_id_reuse(self, enabled = True) :
self.reuse_enabled = enabled
[docs] def id_reuse_enabled(self):
return self.reuse_enabled