66 lines
1.8 KiB
Cython
66 lines
1.8 KiB
Cython
#################### EnumBase ####################
|
|
|
|
cimport cython
|
|
|
|
cdef extern from *:
|
|
int PY_VERSION_HEX
|
|
|
|
cdef object __Pyx_OrderedDict
|
|
if PY_VERSION_HEX >= 0x02070000:
|
|
from collections import OrderedDict as __Pyx_OrderedDict
|
|
else:
|
|
__Pyx_OrderedDict = dict
|
|
|
|
@cython.internal
|
|
cdef class __Pyx_EnumMeta(type):
|
|
def __init__(cls, name, parents, dct):
|
|
type.__init__(cls, name, parents, dct)
|
|
cls.__members__ = __Pyx_OrderedDict()
|
|
def __iter__(cls):
|
|
return iter(cls.__members__.values())
|
|
def __getitem__(cls, name):
|
|
return cls.__members__[name]
|
|
|
|
# @cython.internal
|
|
cdef object __Pyx_EnumBase
|
|
class __Pyx_EnumBase(int):
|
|
__metaclass__ = __Pyx_EnumMeta
|
|
def __new__(cls, value, name=None):
|
|
for v in cls:
|
|
if v == value:
|
|
return v
|
|
if name is None:
|
|
raise ValueError("Unknown enum value: '%s'" % value)
|
|
res = int.__new__(cls, value)
|
|
res.name = name
|
|
setattr(cls, name, res)
|
|
cls.__members__[name] = res
|
|
return res
|
|
def __repr__(self):
|
|
return "<%s.%s: %d>" % (self.__class__.__name__, self.name, self)
|
|
def __str__(self):
|
|
return "%s.%s" % (self.__class__.__name__, self.name)
|
|
|
|
if PY_VERSION_HEX >= 0x03040000:
|
|
from enum import IntEnum as __Pyx_EnumBase
|
|
|
|
#################### EnumType ####################
|
|
#@requires: EnumBase
|
|
|
|
cdef dict __Pyx_globals = globals()
|
|
if PY_VERSION_HEX >= 0x03040000:
|
|
# create new IntEnum()
|
|
{{name}} = __Pyx_EnumBase('{{name}}', __Pyx_OrderedDict([
|
|
{{for item in items}}
|
|
('{{item}}', {{item}}),
|
|
{{endfor}}
|
|
]))
|
|
{{for item in items}}
|
|
__Pyx_globals['{{item}}'] = {{name}}.{{item}}
|
|
{{endfor}}
|
|
else:
|
|
class {{name}}(__Pyx_EnumBase):
|
|
pass
|
|
{{for item in items}}
|
|
__Pyx_globals['{{item}}'] = {{name}}({{item}}, '{{item}}')
|
|
{{endfor}}
|