mirror of
https://github.com/boostorg/python.git
synced 2026-01-26 18:52:26 +00:00
Applied a patch by Roman Yakovenko that makes the export of unnamed enums
better. [SVN r22852]
This commit is contained in:
@@ -1,3 +1,7 @@
|
||||
17 May 2004
|
||||
Applied a patch by Roman Yakovenko that makes the export of unnamed enums
|
||||
better. Thanks Roman!
|
||||
|
||||
23 October 2003
|
||||
Fixed bug where a class would appear more than one in the generated code.
|
||||
|
||||
|
||||
@@ -25,48 +25,34 @@ class EnumExporter(Exporter):
|
||||
self.enum = None
|
||||
|
||||
def Export(self, codeunit, exported_names):
|
||||
if not self.info.exclude:
|
||||
indent = self.INDENT
|
||||
in_indent = self.INDENT*2
|
||||
rename = self.info.rename or self.enum.name
|
||||
full_name = self.enum.FullName()
|
||||
unnamed_enum = False
|
||||
if rename.startswith('$_') or rename.startswith('._'):
|
||||
unique_number = hash(self.info.include)
|
||||
unnamed_enum = True
|
||||
self.ExportUniqueInt(codeunit)
|
||||
full_name = namespaces.pyste + 'UniqueInt<%d>' % unique_number
|
||||
rename = "unnamed"
|
||||
code = indent + namespaces.python
|
||||
if self.info.exclude:
|
||||
return
|
||||
indent = self.INDENT
|
||||
in_indent = self.INDENT*2
|
||||
rename = self.info.rename or self.enum.name
|
||||
full_name = self.enum.FullName()
|
||||
unnamed_enum = False
|
||||
if rename.startswith('$_') or rename.startswith('._'):
|
||||
unnamed_enum = True
|
||||
code = ''
|
||||
if not unnamed_enum:
|
||||
code += indent + namespaces.python
|
||||
code += 'enum_< %s >("%s")\n' % (full_name, rename)
|
||||
for name in self.enum.values:
|
||||
rename = self.info[name].rename or name
|
||||
value_fullname = self.enum.ValueFullName(name)
|
||||
for name in self.enum.values:
|
||||
rename = self.info[name].rename or name
|
||||
value_fullname = self.enum.ValueFullName(name)
|
||||
if not unnamed_enum:
|
||||
code += in_indent + '.value("%s", %s)\n' % (rename, value_fullname)
|
||||
if self.info.export_values or unnamed_enum:
|
||||
code += in_indent + '.export_values()\n'
|
||||
code += indent + ';\n\n'
|
||||
codeunit.Write('module', code)
|
||||
exported_names[self.enum.FullName()] = 1
|
||||
|
||||
|
||||
def ExportUniqueInt(self, codeunit):
|
||||
write = lambda s: codeunit.Write('declaration', s)
|
||||
write('// Unique type for unnamed enums\n')
|
||||
write('#ifndef PYSTE_UNIQUE_INT_DEFINED\n')
|
||||
write('#define PYSTE_UNIQUE_INT_DEFINED\n')
|
||||
write('template<int num>\n')
|
||||
write('struct UniqueInt {\n')
|
||||
write(' int v;\n')
|
||||
write(' enum { value=num };\n')
|
||||
write(' UniqueInt(int v_):\n')
|
||||
write(' v(v_)\n')
|
||||
write(' {}\n')
|
||||
write(' operator int() const\n')
|
||||
write(' { return v; }\n')
|
||||
write('};\n')
|
||||
write('#endif // PYSTE_UNIQUE_INT_DEFINED \n')
|
||||
|
||||
else:
|
||||
code += indent + namespaces.python
|
||||
code += 'scope().attr("%s") = (int)%s;\n' % (rename, value_fullname )
|
||||
if self.info.export_values and not unnamed_enum:
|
||||
code += in_indent + '.export_values()\n'
|
||||
if not unnamed_enum:
|
||||
code += indent + ';\n'
|
||||
code += '\n'
|
||||
codeunit.Write('module', code)
|
||||
exported_names[self.enum.FullName()] = 1
|
||||
|
||||
def Name(self):
|
||||
return self.info.name
|
||||
|
||||
Reference in New Issue
Block a user