~gjc/pybindgen/old-trunk

« back to all changes in this revision

Viewing changes to pybindgen/cppclass.py

  • Committer: Gustavo J. A. M. Carneiro
  • Date: 2008-01-04 18:22:57 UTC
  • Revision ID: gjc@gnome.org-20080104182257-vkgwjyn43zitdoyd
Add general support for templated classes (previously only classes with non-templated typedefs were allowed).

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
        class_ -- original CppClass wrapper object
34
34
        """
35
35
        self.class_ = class_
36
 
        self.name = class_.name + "_PythonProxy"
 
36
        self.name = class_.pystruct + "__PythonHelper"
37
37
        self.virtual_parent_callers = {}
38
38
        self.virtual_proxies = []
39
39
        self.cannot_be_constructed = False
95
95
            code_sink.writeln("%s(%s)" % (self.name, ', '.join(params)))
96
96
            code_sink.indent()
97
97
            code_sink.writeln(": %s(%s), m_pyself(NULL)\n{}" %
98
 
                              (self.class_.name,
 
98
                              (self.class_.full_name,
99
99
                               ', '.join([param.name for param in cons.parameters])))
100
100
            code_sink.unindent()
101
101
            code_sink.writeln()
261
261
    def __init__(self, name, parent=None, incref_method=None, decref_method=None,
262
262
                 automatic_type_narrowing=None, allow_subclassing=None,
263
263
                 is_singleton=False, outer_class=None,
264
 
                 peekref_method=None):
 
264
                 peekref_method=None,
 
265
                 template_parameters=(), custom_template_class_name=None):
265
266
        """Constructor
266
267
        name -- class name
267
268
        parent -- optional parent class wrapper
290
291
        self.outer_class = outer_class
291
292
        self._module = None
292
293
        self.name = name
 
294
        self.template_parameters = template_parameters
 
295
        self.custom_template_class_name = custom_template_class_name
293
296
        self.is_singleton = is_singleton
294
 
        self.full_name = None # full name with C++ namespaces attached
 
297
        self.full_name = None # full name with C++ namespaces attached and template parameters
295
298
        self.methods = {} # name => OverloadedMethod
296
299
        self.constructors = [] # (name, wrapper) pairs
297
300
        self.slots = dict()
478
481
            else:
479
482
                return s
480
483
 
481
 
        flat_name = ''.join([make_upper(s) for s in  self.full_name.split('::')])
 
484
        def mangle(s):
 
485
            "make a name Like<This,and,That> look Like__lt__This_and_That__gt__"
 
486
            s = s.replace('<', '__lt__').replace('>', '__gt__').replace(',', '_')
 
487
            s = s.replace(' ', '_').replace('&', '__amp__').replace('*', '__star__')
 
488
            return s
 
489
        
 
490
        def flatten(name):
 
491
            "make a name like::This look LikeThis"
 
492
            return ''.join([make_upper(mangle(s)) for s in name.split('::')])
 
493
 
 
494
        flat_name = flatten(self.full_name)
 
495
 
 
496
        if self.template_parameters:
 
497
            self.full_name += "< %s >" % (', '.join(self.template_parameters))
 
498
            flat_name += '__' + '_'.join([flatten(s) for s in self.template_parameters])
482
499
 
483
500
        self._pystruct = "Py%s%s" % (prefix, flat_name)
484
501
        self.metaclass_name = "%sMeta" % flat_name
818
835
 
819
836
        module.after_init.write_error_check('PyType_Ready(&%s)'
820
837
                                          % (self.pytypestruct,))
 
838
 
 
839
        if self.template_parameters:
 
840
            if self.custom_template_class_name is None:
 
841
                class_python_name = utils.get_mangled_name(self.name, self.template_parameters)
 
842
            else:
 
843
                class_python_name = self.custom_template_class_name
 
844
        else:
 
845
            class_python_name = self.name
 
846
 
821
847
        if self.outer_class is None:
822
848
            module.after_init.write_code(
823
849
                'PyModule_AddObject(m, \"%s\", (PyObject *) &%s);' % (
824
 
                self.name, self.pytypestruct))
 
850
                class_python_name, self.pytypestruct))
825
851
        else:
826
852
            module.after_init.write_code(
827
853
                'PyDict_SetItemString((PyObject*) %s.tp_dict, \"%s\", (PyObject *) &%s);' % (
828
 
                self.outer_class.pytypestruct, self.name, self.pytypestruct))
 
854
                self.outer_class.pytypestruct, class_python_name, self.pytypestruct))
829
855
 
830
856
        have_constructor = self._generate_constructor(code_sink)
831
857