Revision: 150
Author: roman_yakovenko
Date: 2006-05-22 23:29:14 -0700 (Mon, 22 May 2006)
ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=150&view=rev
Log Message:
-----------
adding vector indexing suite support
Modified Paths:
--------------
pyplusplus_dev/pyplusplus/code_creators/__init__.py
pyplusplus_dev/pyplusplus/code_creators/class_declaration.py
pyplusplus_dev/pyplusplus/code_creators/declaration_based.py
pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py
pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py
pyplusplus_dev/pyplusplus/module_builder/__init__.py
pyplusplus_dev/pyplusplus/module_creator/creator.py
Added Paths:
-----------
pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py
Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py
===================================================================
--- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-05-22 20:34:23 UTC (rev 149)
+++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-05-23 06:29:14 UTC (rev 150)
@@ -102,3 +102,5 @@
from target_configuration import target_configuration_t
from array_1_registrator import array_1_registrator_t
+
+from indexing_suites import vector_indexing_suite_t
\ No newline at end of file
Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py
===================================================================
--- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-05-22 20:34:23 UTC (rev 149)
+++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-05-23 06:29:14 UTC (rev 150)
@@ -12,6 +12,7 @@
import smart_pointers
import declaration_based
import array_1_registrator
+import indexing_suites
from pygccxml import declarations
class class_t( scoped.scoped_t ):
@@ -185,6 +186,9 @@
if isinstance( inst, array_1_registrator.array_1_registrator_t ):
return True
+ if isinstance( inst, indexing_suites.indexing_suite_t ):
+ return True
+
return False
def _get_class_var_name(self):
Modified: pyplusplus_dev/pyplusplus/code_creators/declaration_based.py
===================================================================
--- pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2006-05-22 20:34:23 UTC (rev 149)
+++ pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2006-05-23 06:29:14 UTC (rev 150)
@@ -41,3 +41,7 @@
def _set_alias(self, alias):
self.declaration.alias = alias
alias = property( _get_alias, _set_alias )
+
+ def _get_decl_identifier( self ):
+ return algorithm.create_identifier( self, self.declaration.decl_string )
+ decl_identifier = property( _get_decl_identifier )
\ No newline at end of file
Added: pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py
===================================================================
--- pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py (rev 0)
+++ pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-05-23 06:29:14 UTC (rev 150)
@@ -0,0 +1,71 @@
+# Copyright 2004 Roman Yakovenko.
+# Distributed under the Boost Software License, Version 1.0. (See
+# accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+import os
+import types
+import scoped
+import custom
+import calldef
+import algorithm
+import smart_pointers
+import declaration_based
+import array_1_registrator
+from pygccxml import declarations
+
+class indexing_suite_t( scoped.scoped_t ):
+ def __init__(self, class_inst, suite_configuration, parent=None ):
+ scoped.scoped_t.__init__( self
+ , parent=parent
+ , declaration=class_inst )
+ self._suite_configuration = suite_configuration
+
+ def _get_suite_configuration( self ):
+ return self._suite_configuration
+ suite_configuration = property( _get_suite_configuration )
+
+class vector_indexing_suite_t( indexing_suite_t ):
+ """
+ Creates boost.python code that needed to export a vector of some class
+ """
+ #class_< std::vector<X> >("XVec")
+ # .def(vector_indexing_suite<std::vector<X> >())
+ #;
+
+ def __init__(self, class_inst, suite_configuration, parent=None ):
+ indexing_suite_t.__init__( self
+ , class_inst=class_inst
+ , suite_configuration=suite_configuration
+ , parent=parent )
+
+ def _create_indexing_suite_declaration( self ):
+ vector_indexing_suite = algorithm.create_identifier( self, 'boost::python::vector_indexing_suite' )
+ container_identifier = algorithm.create_identifier( self, self.suite_configuration.container )
+ container = declarations.templates.join( container_identifier, [ self.decl_identifier ] )
+ args = [container]
+ if self.suite_configuration.derived_policies:
+ if self.suite_configuration.no_proxy:
+ args.append( 'true' )
+ else:
+ args.append( 'false' )
+ args.append( self.suite_configuration.derived_policies )
+ else:
+ if self.suite_configuration.no_proxy:
+ args.append( 'true' )
+ return declarations.templates.join( vector_indexing_suite, args )
+
+ def _create_class_declaration( self ):
+ class_ = algorithm.create_identifier( self, 'boost::python::class_' )
+ container_identifier = algorithm.create_identifier( self, self.suite_configuration.container )
+ container = declarations.templates.join( container_identifier, [ self.decl_identifier ] )
+ return declarations.templates.join( class_, [ container ] )
+
+ def _create_impl(self):
+ result = []
+ result.append( self._create_class_declaration() + '("%s")' % self.suite_configuration.name )
+ result.append( self.indent( ".def( %s() )" % self._create_indexing_suite_declaration() ) )
+ result.append( ';' )
+ return os.linesep.join( result )
+
+
\ No newline at end of file
Modified: pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py
===================================================================
--- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-05-22 20:34:23 UTC (rev 149)
+++ pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-05-23 06:29:14 UTC (rev 150)
@@ -44,6 +44,7 @@
from calldef_wrapper import free_function_t
from calldef_wrapper import free_operator_t
+from class_wrapper import vector_indexing_suite_t
from class_wrapper import class_declaration_t
from class_wrapper import class_t
Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py
===================================================================
--- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-05-22 20:34:23 UTC (rev 149)
+++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-05-23 06:29:14 UTC (rev 150)
@@ -8,6 +8,14 @@
from pygccxml import declarations
import user_text
+class vector_indexing_suite_t( object ):
+ def __init__( self, name, container='std::vector', no_proxy=False, derived_policies='' ):
+ object.__init__( self )
+ self.name = name
+ self.container = container
+ self.no_proxy = no_proxy
+ self.derived_policies = derived_policies
+
class class_declaration_t(decl_wrapper.decl_wrapper_t, declarations.class_declaration_t):
def __init__(self, *arguments, **keywords):
declarations.class_declaration_t.__init__(self, *arguments, **keywords )
@@ -25,6 +33,7 @@
self._wrapper_alias = self._generate_valid_name() + "_wrapper"
self._user_code = []
self._wrapper_user_code = []
+ self._indexing_suites = []
def _get_always_expose_using_scope( self ):
return self._always_expose_using_scope
@@ -77,6 +86,12 @@
def _set_wrapper_user_code( self, value ):
self._wrapper_user_code = value
wrapper_user_code = property( _get_wrapper_user_code, _set_wrapper_user_code )
+
+ def _get_indexing_suites( self ):
+ return self._indexing_suites
+ def _set_indexing_suites( self, value ):
+ self._indexing_suites = value
+ indexing_suites = property( _get_indexing_suites, _set_indexing_suites )
def add_code( self, code, works_on_instance=True ):
"""works_on_instance: If true, the custom code can be applied directly to obj inst.
Modified: pyplusplus_dev/pyplusplus/module_builder/__init__.py
===================================================================
--- pyplusplus_dev/pyplusplus/module_builder/__init__.py 2006-05-22 20:34:23 UTC (rev 149)
+++ pyplusplus_dev/pyplusplus/module_builder/__init__.py 2006-05-23 06:29:14 UTC (rev 150)
@@ -43,6 +43,8 @@
from pyplusplus.decl_wrappers import variable_t
from pyplusplus.decl_wrappers import scopedef_t
+from pyplusplus.decl_wrappers import vector_indexing_suite_t
+
from pyplusplus.decl_wrappers import print_declarations
import call_policies
Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py
===================================================================
--- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-05-22 20:34:23 UTC (rev 149)
+++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-05-23 06:29:14 UTC (rev 150)
@@ -10,6 +10,7 @@
import types_database
from pyplusplus import code_repository
from sets import Set as set
+from pyplusplus import decl_wrappers
ACCESS_TYPES = declarations.ACCESS_TYPES
VIRTUALITY_TYPES = declarations.VIRTUALITY_TYPES
@@ -352,6 +353,13 @@
return self.__extmodule
def _create_includes(self):
+ for cls in self.__decls:
+ if not isinstance( cls, decl_wrappers.class_t ):
+ continue
+ if cls.indexing_suites:
+ include = code_creators.include_t( header="boost/python/suite/indexing/vector_indexing_suite.hpp" )
+ self.__extmodule.adopt_include(include)
+ break
for fn in declarations.declaration_files( self.__decls ):
include = code_creators.include_t( header=fn )
self.__extmodule.adopt_include(include)
@@ -510,6 +518,13 @@
def visit_class_declaration(self ):
pass
+ def register_indexing_suites(self, class_decl, class_code_creator):
+ for suite in class_decl.indexing_suites:
+ assert isinstance( suite, decl_wrappers.vector_indexing_suite_t )
+ creator = code_creators.vector_indexing_suite_t( class_inst=class_decl
+ , suite_configuration=suite )
+ class_code_creator.adopt_creator( creator )
+
def visit_class(self ):
if self.curr_decl.ignore:
return
@@ -566,6 +581,8 @@
self.curr_decl = temp_curr_decl
self.curr_code_creator = temp_curr_parent
+ self.register_indexing_suites( self.curr_decl, self.curr_code_creator )
+
def visit_enumeration(self):
if self.curr_decl.ignore:
return
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|