Improve enum implementation
This commit is contained in:
parent
372d6804e4
commit
7788346152
2 changed files with 28 additions and 27 deletions
|
|
@ -125,6 +125,8 @@ class Class(_Type):
|
||||||
# generate methods
|
# generate methods
|
||||||
for meth in self.methods:
|
for meth in self.methods:
|
||||||
meth.compile_cpp(writer)
|
meth.compile_cpp(writer)
|
||||||
|
for enum in self.enums:
|
||||||
|
enum.compile_cpp(writer)
|
||||||
|
|
||||||
# generate method table
|
# generate method table
|
||||||
writer.println('static')
|
writer.println('static')
|
||||||
|
|
@ -135,6 +137,11 @@ class Class(_Type):
|
||||||
name = meth.name
|
name = meth.name
|
||||||
func = meth.c_name
|
func = meth.c_name
|
||||||
writer.println(fmt % locals())
|
writer.println(fmt % locals())
|
||||||
|
for enumkind in self.enums:
|
||||||
|
for enum in enumkind.value_names:
|
||||||
|
name = enum
|
||||||
|
func = enumkind.c_name(enum)
|
||||||
|
writer.println(fmt % locals())
|
||||||
writer.println('{ NULL },')
|
writer.println('{ NULL },')
|
||||||
writer.println('};')
|
writer.println('};')
|
||||||
writer.println()
|
writer.println()
|
||||||
|
|
@ -212,38 +219,22 @@ class Enum(object):
|
||||||
return self.fullname
|
return self.fullname
|
||||||
|
|
||||||
def wrap(self, writer, val):
|
def wrap(self, writer, val):
|
||||||
ret = writer.declare('PyObject*', 'NULL')
|
ret = writer.declare('PyObject*', 'PyInt_FromLong(%s)' % val)
|
||||||
with writer.block('switch(%s) ' % val):
|
|
||||||
for v in self.value_names:
|
|
||||||
writer.println('case %s::%s:' % (self.parent, v))
|
|
||||||
with writer.indent():
|
|
||||||
fmt = '%(ret)s = PyString_FromString("%(v)s");'
|
|
||||||
writer.println(fmt % locals())
|
|
||||||
writer.println('break;')
|
|
||||||
else:
|
|
||||||
writer.println('default:')
|
|
||||||
with writer.indent():
|
|
||||||
writer.raises(ValueError, 'Invalid enum %s' % v)
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def unwrap(self, writer, val):
|
def unwrap(self, writer, val):
|
||||||
tostring = 'PyString_AsString(%(val)s)' % locals()
|
convert_long_to_enum = '(%s)PyInt_AsLong(%s)' % (self.fullname, val)
|
||||||
string = writer.declare('const char*', tostring)
|
ret = writer.declare(self.fullname, convert_long_to_enum)
|
||||||
ret = writer.declare('%s::%s' % (self.parent, self.name))
|
|
||||||
parent = self.parent
|
|
||||||
iffmt = 'if (string_equal(%(string)s, "%(v)s"))'
|
|
||||||
for i, v in enumerate(self.value_names):
|
|
||||||
with writer.block(iffmt % locals()):
|
|
||||||
fmt = '%(ret)s = %(parent)s::%(v)s;'
|
|
||||||
writer.println(fmt % locals())
|
|
||||||
if i == 0:
|
|
||||||
iffmt = 'else ' + iffmt
|
|
||||||
with writer.block('else'):
|
|
||||||
writer.raises(ValueError, 'Invalid enum.')
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
def c_name(self, enum):
|
||||||
|
return cg.mangle("%s_%s_%s" % (self.parent, self.name, enum))
|
||||||
|
|
||||||
def compile_cpp(self, writer):
|
def compile_cpp(self, writer):
|
||||||
pass
|
for enum in self.value_names:
|
||||||
|
with writer.py_function(self.c_name(enum)):
|
||||||
|
ret = self.wrap(writer, '::'.join([self.parent.fullname, enum]))
|
||||||
|
writer.return_value(ret)
|
||||||
|
|
||||||
def compile_py(self, writer):
|
def compile_py(self, writer):
|
||||||
with writer.block('class %s:' % self.name):
|
with writer.block('class %s:' % self.name):
|
||||||
|
|
@ -251,9 +242,12 @@ class Enum(object):
|
||||||
for v in self.value_names:
|
for v in self.value_names:
|
||||||
if v in RESERVED:
|
if v in RESERVED:
|
||||||
k = '%s_' % v
|
k = '%s_' % v
|
||||||
|
fmt = '%(k)s = getattr(%(p)s, "%(v)s")()'
|
||||||
else:
|
else:
|
||||||
k = v
|
k = v
|
||||||
writer.println('%(k)s = "%(v)s"' % locals())
|
fmt = '%(k)s = %(p)s.%(v)s()'
|
||||||
|
p = '.'.join(['_api'] + self.parent.fullname.split('::')[1:])
|
||||||
|
writer.println(fmt % locals())
|
||||||
writer.println()
|
writer.println()
|
||||||
|
|
||||||
class Method(object):
|
class Method(object):
|
||||||
|
|
|
||||||
|
|
@ -136,6 +136,13 @@ static
|
||||||
name = u.name
|
name = u.name
|
||||||
func = u.c_name
|
func = u.c_name
|
||||||
writer.println(fmt % locals())
|
writer.println(fmt % locals())
|
||||||
|
for u in units:
|
||||||
|
if isinstance(u, Enum):
|
||||||
|
for enum in u.value_names:
|
||||||
|
name = enum
|
||||||
|
func = u.c_name(enum)
|
||||||
|
writer.println(fmt % locals())
|
||||||
|
|
||||||
writer.println('{ NULL },')
|
writer.println('{ NULL },')
|
||||||
writer.println('};')
|
writer.println('};')
|
||||||
writer.println()
|
writer.println()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue