mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-01 09:23:03 -04:00
added disjoint, Enum
This commit is contained in:
parent
6a406c9196
commit
dc29e84487
@ -464,6 +464,14 @@ def uniqueElements(L):
|
|||||||
"""are all elements of list unique?"""
|
"""are all elements of list unique?"""
|
||||||
return len(L) == len(list2dict(L))
|
return len(L) == len(list2dict(L))
|
||||||
|
|
||||||
|
def disjoint(L1, L2):
|
||||||
|
"""returns non-zero if L1 and L2 have no common elements"""
|
||||||
|
used = dict([(k,None) for k in L1])
|
||||||
|
for k in L2:
|
||||||
|
if k in used:
|
||||||
|
return 0
|
||||||
|
return 1
|
||||||
|
|
||||||
def contains(whole, sub):
|
def contains(whole, sub):
|
||||||
"""
|
"""
|
||||||
Return 1 if whole contains sub, 0 otherwise
|
Return 1 if whole contains sub, 0 otherwise
|
||||||
@ -931,3 +939,71 @@ def randUint31(rng=random.random):
|
|||||||
"""returns a random integer in [0..2^31).
|
"""returns a random integer in [0..2^31).
|
||||||
rng must return float in [0..1]"""
|
rng must return float in [0..1]"""
|
||||||
return int(rng() * 0x7FFFFFFF)
|
return int(rng() * 0x7FFFFFFF)
|
||||||
|
|
||||||
|
class Enum:
|
||||||
|
"""Pass in list of strings or string of comma-separated strings.
|
||||||
|
Items are accessible as instance.item, and are assigned unique,
|
||||||
|
increasing integer values. Pass in integer for 'start' to override
|
||||||
|
starting value.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
>>> colors = Enum('red, green, blue')
|
||||||
|
>>> colors.red
|
||||||
|
0
|
||||||
|
>>> colors.green
|
||||||
|
1
|
||||||
|
>>> colors.blue
|
||||||
|
2
|
||||||
|
>>> colors.getString(colors.red)
|
||||||
|
'red'
|
||||||
|
"""
|
||||||
|
|
||||||
|
if __debug__:
|
||||||
|
# chars that cannot appear within an item string.
|
||||||
|
InvalidChars = string.whitespace
|
||||||
|
def _checkValidIdentifier(item):
|
||||||
|
invalidChars = string.whitespace+string.punctuation
|
||||||
|
invalidChars = invalidChars.replace('_','')
|
||||||
|
invalidFirstChars = invalidChars+string.digits
|
||||||
|
if item[0] in invalidFirstChars:
|
||||||
|
raise SyntaxError, ("Enum '%s' contains invalid first char" %
|
||||||
|
item)
|
||||||
|
if not disjoint(item, invalidChars):
|
||||||
|
for char in item:
|
||||||
|
if char in invalidChars:
|
||||||
|
raise SyntaxError, (
|
||||||
|
"Enum\n'%s'\ncontains illegal char '%s'" %
|
||||||
|
(item, char))
|
||||||
|
return 1
|
||||||
|
_checkValidIdentifier = staticmethod(_checkValidIdentifier)
|
||||||
|
|
||||||
|
def __init__(self, items, start=0):
|
||||||
|
if type(items) == types.StringType:
|
||||||
|
items = items.split(',')
|
||||||
|
|
||||||
|
self._stringTable = {}
|
||||||
|
|
||||||
|
# make sure we don't overwrite an existing element of the class
|
||||||
|
assert(self._checkExistingMembers(items))
|
||||||
|
assert(uniqueElements(items))
|
||||||
|
|
||||||
|
i = start
|
||||||
|
for item in items:
|
||||||
|
# remove leading/trailing whitespace
|
||||||
|
item = string.strip(item)
|
||||||
|
# make sure there are no invalid characters
|
||||||
|
assert(Enum._checkValidIdentifier(item))
|
||||||
|
self.__dict__[item] = i
|
||||||
|
self._stringTable[i] = item
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
def getString(self, value):
|
||||||
|
return self._stringTable[value]
|
||||||
|
|
||||||
|
if __debug__:
|
||||||
|
def _checkExistingMembers(self, items):
|
||||||
|
for item in items:
|
||||||
|
if hasattr(self, item):
|
||||||
|
return 0
|
||||||
|
return 1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user