32c32
< from types import FunctionType
---
> from types import FunctionType, MethodType
99a100,139
> def default_cxx_predecls(cls, code):
> '''A forward class declaration is sufficient since we are
> just declaring a pointer.'''
>
> class_path = cls._value_dict['cxx_class'].split('::')
> for ns in class_path[:-1]:
> code('namespace $ns {')
> code('class $0;', class_path[-1])
> for ns in reversed(class_path[:-1]):
> code('/* namespace $ns */ }')
>
> def default_swig_objdecls(cls, code):
> class_path = cls.cxx_class.split('::')
> classname = class_path[-1]
> namespaces = class_path[:-1]
>
> for ns in namespaces:
> code('namespace $ns {')
>
> if namespaces:
> code('// avoid name conflicts')
> sep_string = '_COLONS_'
> flat_name = sep_string.join(class_path)
> code('%rename($flat_name) $classname;')
>
> code()
> code('// stop swig from creating/wrapping default ctor/dtor')
> code('%nodefault $classname;')
> code('class $classname')
> if cls._base:
> code(' : public ${{cls._base.cxx_class}}')
> code('{};')
>
> for ns in reversed(namespaces):
> code('/* namespace $ns */ }')
>
> def public_value(key, value):
> return key.startswith('_') or \
> isinstance(value, (FunctionType, MethodType, classmethod, type))
>
109,111c149,151
< 'cxx_predecls' : list,
< 'swig_objdecls' : list,
< 'swig_predecls' : list,
---
> 'cxx_predecls' : MethodType,
> 'swig_objdecls' : MethodType,
> 'swig_predecls' : MethodType,
130,132c170
< if key.startswith('_') or isinstance(val, (FunctionType,
< classmethod,
< type)):
---
> if public_value(key, val):
193,201c231,233
< if 'cxx_predecls' not in cls._value_dict:
< # A forward class declaration is sufficient since we are
< # just declaring a pointer.
< class_path = cls._value_dict['cxx_class'].split('::')
< class_path.reverse()
< decl = 'class %s;' % class_path[0]
< for ns in class_path[1:]:
< decl = 'namespace %s { %s }' % (ns, decl)
< cls._value_dict['cxx_predecls'] = [decl]
---
> if 'cxx_predecls' not in cls.__dict__:
> m = MethodType(default_cxx_predecls, cls, MetaSimObject)
> setattr(cls, 'cxx_predecls', m)
203,207c235,236
< if 'swig_predecls' not in cls._value_dict:
< # A forward class declaration is sufficient since we are
< # just declaring a pointer.
< cls._value_dict['swig_predecls'] = \
< cls._value_dict['cxx_predecls']
---
> if 'swig_predecls' not in cls.__dict__:
> setattr(cls, 'swig_predecls', getattr(cls, 'cxx_predecls'))
209,210c238,240
< if 'swig_objdecls' not in cls._value_dict:
< cls._value_dict['swig_objdecls'] = []
---
> if 'swig_objdecls' not in cls.__dict__:
> m = MethodType(default_swig_objdecls, cls, MetaSimObject)
> setattr(cls, 'swig_objdecls', m)
285c315
< if attr.startswith('_'):
---
> if public_value(attr, value):
331,333c361,364
< def cxx_decl(cls):
< code = "#ifndef __PARAMS__%s\n" % cls
< code += "#define __PARAMS__%s\n\n" % cls
---
> def cxx_decl(cls, code):
> code('''\
> #ifndef __PARAMS__${cls}__
> #define __PARAMS__${cls}__
334a366,367
> ''')
>
347,359c380,384
< # get a list of lists of predeclaration lines
< predecls = []
< predecls.extend(cls.cxx_predecls)
< for p in params:
< predecls.extend(p.cxx_predecls())
< # remove redundant lines
< predecls2 = []
< for pd in predecls:
< if pd not in predecls2:
< predecls2.append(pd)
< predecls2.sort()
< code += "\n".join(predecls2)
< code += "\n\n";
---
> # get all predeclarations
> cls.cxx_predecls(code)
> for param in params:
> param.cxx_predecls(code)
> code()
362c387,388
< code += '#include "params/%s.hh"\n\n' % cls._base.type
---
> code('#include "params/${{cls._base.type}}.hh"')
> code()
366,367c392,393
< code += '#include "enums/%s.hh"\n' % ptype.__name__
< code += "\n\n"
---
> code('#include "enums/${{ptype.__name__}}.hh"')
> code()
369c395
< code += cls.cxx_struct(cls._base, params)
---
> cls.cxx_struct(code, cls._base, params)
372c398,399
< code += "\n#endif\n"
---
> code()
> code('#endif // __PARAMS__${cls}__')
375c402
< def cxx_struct(cls, base, params):
---
> def cxx_struct(cls, code, base, params):
377c404,405
< return '#include "sim/sim_object_params.hh"\n'
---
> code('#include "sim/sim_object_params.hh"')
> return
380c408
< code = "struct %sParams" % cls
---
> code("struct ${cls}Params")
382,383c410,411
< code += " : public %sParams" % base.type
< code += "\n{\n"
---
> code(" : public ${{base.type}}Params")
> code("{")
386,390c414
< code += " %s create();\n" % cls.cxx_type
< decls = [p.cxx_decl() for p in params]
< decls.sort()
< code += "".join([" %s\n" % d for d in decls])
< code += "};\n"
---
> code(" ${{cls.cxx_type}} create();")
392c416,420
< return code
---
> code.indent()
> for param in params:
> param.cxx_decl(code)
> code.dedent()
> code('};')
394,395c422,424
< def swig_decl(cls):
< code = '%%module %s\n' % cls
---
> def swig_decl(cls, code):
> code('''\
> %module $cls
397,399c426,428
< code += '%{\n'
< code += '#include "params/%s.hh"\n' % cls
< code += '%}\n\n'
---
> %{
> #include "params/$cls.hh"
> %}
400a430,431
> ''')
>
408,420c439,442
< # get a list of lists of predeclaration lines
< predecls = []
< predecls.extend([ p.swig_predecls() for p in params ])
< # flatten
< predecls = reduce(lambda x,y:x+y, predecls, [])
< # remove redundant lines
< predecls2 = []
< for pd in predecls:
< if pd not in predecls2:
< predecls2.append(pd)
< predecls2.sort()
< code += "\n".join(predecls2)
< code += "\n\n";
---
> # get all predeclarations
> for param in params:
> param.swig_predecls(code)
> code()
423c445,446
< code += '%%import "params/%s.i"\n\n' % cls._base.type
---
> code('%import "params/${{cls._base.type}}.i"')
> code()
427,428c450,451
< code += '%%import "enums/%s.hh"\n' % ptype.__name__
< code += "\n\n"
---
> code('%import "enums/${{ptype.__name__}}.hh"')
> code()
430,431c453,454
< code += '%%import "params/%s_type.hh"\n\n' % cls
< code += '%%include "params/%s.hh"\n\n' % cls
---
> code('%import "params/${cls}_type.hh"')
> code('%include "params/${cls}.hh"')
433,434d455
< return code
<
445c466,468
< swig_objdecls = [ '%include "python/swig/sim_object.i"' ]
---
> @classmethod
> def swig_objdecls(cls, code):
> code('%include "python/swig/sim_object.i"')