Thread: [pygccxml-commit] SF.net SVN: pygccxml: [188] pyplusplus_dev/pyplusplus/file_writers
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-05-31 03:41:59
|
Revision: 188 Author: roman_yakovenko Date: 2006-05-30 20:41:50 -0700 (Tue, 30 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=188&view=rev Log Message: ----------- system headers that not used will not be generated Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/module.py pyplusplus_dev/pyplusplus/file_writers/writer.py Modified: pyplusplus_dev/pyplusplus/code_creators/module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/module.py 2006-05-31 03:41:08 UTC (rev 187) +++ pyplusplus_dev/pyplusplus/code_creators/module.py 2006-05-31 03:41:50 UTC (rev 188) @@ -27,7 +27,11 @@ def add_system_header( self, header ): normalize = include_directories.include_directories_t.normalize self.__system_headers.append( normalize( header ) ) - + + def is_system_header( self, header ): + normalize = include_directories.include_directories_t.normalize + return normalize( header ) in self.__system_headers + def _get_include_dirs(self): include_dirs = algorithm.creator_finder.find_by_class_instance( what=include_directories.include_directories_t Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2006-05-31 03:41:08 UTC (rev 187) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2006-05-31 03:41:50 UTC (rev 188) @@ -41,7 +41,8 @@ def write_code_repository(self, dir): for cr in code_repository.all: - self.write_file( os.path.join( dir, cr.file_name ), cr.code ) + if self.__extmodule.is_system_header( cr.file_name ): + self.write_file( os.path.join( dir, cr.file_name ), cr.code ) def write_file( fpath, content ): """Write a source file. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-06-29 09:09:47
|
Revision: 263 Author: roman_yakovenko Date: 2006-06-29 02:09:33 -0700 (Thu, 29 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=263&view=rev Log Message: ----------- updating multiple_files.py writer to support new indexing suite Modified Paths: -------------- pyplusplus_dev/examples/pyboost_dev/dev/boost_random/generate_code.py pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py Modified: pyplusplus_dev/examples/pyboost_dev/dev/boost_random/generate_code.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/boost_random/generate_code.py 2006-06-29 06:18:44 UTC (rev 262) +++ pyplusplus_dev/examples/pyboost_dev/dev/boost_random/generate_code.py 2006-06-29 09:09:33 UTC (rev 263) @@ -30,7 +30,8 @@ , gccxml_path=random_settings.gccxml.executable , include_paths=[random_settings.boost.include] , define_symbols=random_settings.defined_symbols - , undefine_symbols=random_settings.undefined_symbols) + , undefine_symbols=random_settings.undefined_symbols + , indexing_suite_version=2) self.generators = [ "ecuyer1988" , "hellekalek1995" , "kreutzer1986" Modified: pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py 2006-06-29 06:18:44 UTC (rev 262) +++ pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py 2006-06-29 09:09:33 UTC (rev 263) @@ -42,7 +42,8 @@ , include_paths=[date_time_settings.boost.include] , define_symbols=date_time_settings.defined_symbols , undefine_symbols=date_time_settings.undefined_symbols - , optimize_queries=False) + , optimize_queries=False + , indexing_suite_version=2) if sys.platform == 'win32': linux_name = "time_duration<boost::posix_time::time_duration, boost::date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, (boost::date_time::time_resolutions)5, (long long)1000000, 6, int> >" win_name = "time_duration<boost::posix_time::time_duration, boost::date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, (boost::date_time::time_resolutions)5, (long long)1000000, 6, long> >" Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-06-29 06:18:44 UTC (rev 262) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-06-29 09:09:33 UTC (rev 263) @@ -6,6 +6,8 @@ import os import writer from sets import Set as set +from pygccxml import declarations +from pyplusplus import decl_wrappers from pyplusplus import code_creators from pyplusplus import _logging_ @@ -49,8 +51,11 @@ doc="""The name of the output directory. @type: str """ ) - - def create_header( self, file_name, function_name ): + + def create_function_code( self, function_name ): + return "void %s();" % function_name + + def create_header( self, file_name, code ): """Return the content of a header file. @param file_name: A string that uniquely identifies the file name @@ -64,17 +69,30 @@ "#ifndef __%(file_name)s_hpp__pyplusplus_wrapper__" , "#define __%(file_name)s_hpp__pyplusplus_wrapper__" , '' - , "void %(function_name)s();" + , "%(code)s;" , '' , "#endif//__%(file_name)s_hpp__pyplusplus_wrapper__" ]) content = '' if self.extmodule.license: content = self.extmodule.license.create() + os.linesep - content = content + tmpl % { 'file_name' : file_name - , 'function_name' : function_name } + content = content + tmpl % { 'file_name' : file_name, 'code' : code } return content + def find_out_value_traits_header( self, code_creator ): + if not isinstance( code_creator, ( code_creators.class_t, code_creators.class_declaration_t ) ): + return None + if None is code_creator.declaration.indexing_suite: + return None + if not isinstance( code_creator.declaration.indexing_suite, decl_wrappers.indexing_suite2_t ): + return None + value_type = code_creator.declaration.indexing_suite.value_type() + class_traits = declarations.class_traits + if not class_traits.is_my_case( value_type ): + return None + value_class = class_traits.get_declaration( value_type ) + return self.create_value_traits_header_name( value_class ) + def create_source( self, file_name, function_name, creators ): """Return the content of a cpp file. @@ -99,7 +117,11 @@ , self.extmodule.creators ) includes = map( lambda include_creator: include_creator.create() , include_creators ) - answer.append( os.linesep.join(includes) ) + for creator in creators: + value_traits_header = self.find_out_value_traits_header( creator ) + if value_traits_header: + includes.append( '#include "%s"' % value_traits_header ) + answer.append( os.linesep.join(includes) ) # Write all 'global' namespace_alias_t and namespace_using_t creators first... affect_creators = filter( lambda x: isinstance( x, code_creators.namespace_alias_t ) @@ -136,13 +158,14 @@ # Write the .h file... header_name = file_path + self.HEADER_EXT self.write_file( header_name - , self.create_header( class_creator.alias, function_name ) ) + , self.create_header( class_creator.alias + , self.create_function_code( function_name ) ) ) # Write the .cpp file... self.write_file( file_path + self.SOURCE_EXT , self.create_source( class_creator.alias , function_name , [class_creator] )) - if class_creator.wrapper: + if isinstance( class_creator, code_creators.class_t ) and class_creator.wrapper: # The wrapper has already been written above, so replace the create() # method with a new 'method' that just returns an empty string because # this method is later called again for the main source file. @@ -171,6 +194,19 @@ _logging_.logger.error( msg ) raise + def create_value_traits_header_name( self, value_class ): + return "_" + value_class.alias + "__value_traits" + self.HEADER_EXT + + def split_value_traits( self, value_traits ): + """ + Write the value_traits class to header file, that will be included + from files, that uses indexing suite 2 + """ + code = value_traits.create() + self.create_header( self.create_value_traits_header_name( value_traits.declaration ) + , code ) + value_traits.create = lambda: '' + def split_creators( self, creators, pattern, function_name, registrator_pos ): """Write non-class creators into a particular .h/.cpp file. @@ -189,7 +225,7 @@ file_path = os.path.join( self.directory_path, file_pattern ) header_name = file_path + self.HEADER_EXT self.write_file( header_name - , self.create_header( file_pattern, function_name ) ) + , self.create_header( file_pattern, self.create_function_code( function_name ) ) ) self.write_file( file_path + self.SOURCE_EXT , self.create_source( file_pattern , function_name @@ -242,8 +278,11 @@ self.extmodule.do_include_dirs_optimization() + value_traits_classes = filter( lambda x: isinstance(x, code_creators.value_traits_t ) + , self.extmodule.creators ) + # Obtain a list of all class creators... - class_creators = filter( lambda x: isinstance(x, code_creators.class_t ) + class_creators = filter( lambda x: isinstance(x, ( code_creators.class_t, code_creators.class_declaration_t ) ) , self.extmodule.body.creators ) # ...and write a .h/.cpp file for each class map( self.split_class, class_creators ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-06-29 11:17:12
|
Revision: 264 Author: roman_yakovenko Date: 2006-06-29 04:16:59 -0700 (Thu, 29 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=264&view=rev Log Message: ----------- fixing bugs Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/module_creator/types_database.py Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-29 09:09:33 UTC (rev 263) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-29 11:16:59 UTC (rev 264) @@ -55,9 +55,7 @@ result[-1] = result[-1] + ' ' + scope_var_name result[-1] = result[-1] + '( %s );' % self.class_var_name - for x in creators: - if x is used_init: - continue + for x in self.creators: if not x.works_on_instance: result.append( x.create() ) else: Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-06-29 09:09:33 UTC (rev 263) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-06-29 11:16:59 UTC (rev 264) @@ -202,9 +202,9 @@ Write the value_traits class to header file, that will be included from files, that uses indexing suite 2 """ - code = value_traits.create() - self.create_header( self.create_value_traits_header_name( value_traits.declaration ) - , code ) + header_name = self.create_value_traits_header_name( value_traits.declaration ) + file_path = os.path.join( self.directory_path, header_name ) + self.write_file( file_path, self.create_header( header_name, value_traits.create() ) ) value_traits.create = lambda: '' def split_creators( self, creators, pattern, function_name, registrator_pos ): @@ -280,7 +280,8 @@ value_traits_classes = filter( lambda x: isinstance(x, code_creators.value_traits_t ) , self.extmodule.creators ) - + map( self.split_value_traits, value_traits_classes ) + # Obtain a list of all class creators... class_creators = filter( lambda x: isinstance(x, ( code_creators.class_t, code_creators.class_declaration_t ) ) , self.extmodule.body.creators ) Modified: pyplusplus_dev/pyplusplus/module_creator/types_database.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/types_database.py 2006-06-29 09:09:33 UTC (rev 263) +++ pyplusplus_dev/pyplusplus/module_creator/types_database.py 2006-06-29 11:16:59 UTC (rev 264) @@ -56,11 +56,17 @@ type = declarations.remove_reference( type ) type = declarations.remove_cv( type ) type = declarations.remove_declarated( type ) - - if not declarations.is_class( type ) and not declarations.is_class_declaration( type ): + + class_traits = declarations.class_traits + class_declaration_traits = declarations.class_declaration_traits + if not class_traits.is_my_case( type ) and not class_declaration_traits.is_my_case( type ): return False - - container_cls = type + + if class_traits.is_my_case( type ): + container_cls = class_traits.get_declaration( type ) + else: + container_cls = class_declaration_traits.get_declaration( type ) + if None is container_cls.indexing_suite: return False This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-11 12:39:58
|
Revision: 296 Author: roman_yakovenko Date: 2006-07-11 05:39:43 -0700 (Tue, 11 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=296&view=rev Log Message: ----------- improving generated code stability( order of generated code should not change from one generation to another ) Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/module_creator/class_organizer.py pyplusplus_dev/pyplusplus/module_creator/creator.py Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-07-11 09:05:55 UTC (rev 295) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-07-11 12:39:43 UTC (rev 296) @@ -293,7 +293,8 @@ self.split_global_variables() self.split_free_functions() - if write_main: + if write_main: + self.__include_creators.sort( cmp=lambda ic1, ic2: cmp( ic1.header, ic2.header ) ) map( lambda creator: self.extmodule.adopt_include( creator ) , self.__include_creators ) main_cpp = os.path.join( self.directory_path, self.extmodule.body.name + '.main.cpp' ) Modified: pyplusplus_dev/pyplusplus/module_creator/class_organizer.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/class_organizer.py 2006-07-11 09:05:55 UTC (rev 295) +++ pyplusplus_dev/pyplusplus/module_creator/class_organizer.py 2006-07-11 12:39:43 UTC (rev 296) @@ -10,12 +10,15 @@ WHITE = 0 GRAY = 1 BLACK = 2 + class class_organizer_t(object): def __init__( self, decls ): - object.__init__( self ) + object.__init__( self ) + self.__classes = filter( lambda x: isinstance( x, declarations.class_t ) - , decls ) + , decls ) + self.__classes.sort( lambda cls1, cls2: cmp( cls1.decl_string, cls2.decl_string ) ) self.__dependencies_graph = self._build_graph() self.__time = 0 self.__colors = dict( zip( self.__dependencies_graph.keys() Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-07-11 09:05:55 UTC (rev 295) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-07-11 12:39:43 UTC (rev 296) @@ -113,7 +113,7 @@ decls = filter( lambda x: not x.ignore, decls ) return decls - def _reorder_decls(self, decls ): + def _reorder_decls(self, decls ): classes = filter( lambda x: isinstance( x, declarations.class_t ) , decls ) @@ -126,15 +126,33 @@ #type should be exported before it can be used. variables = [] enums = [] - others = [] + others = [] + classes = [] + constructors = [] for inst in ordered: if isinstance( inst, declarations.variable_t ): variables.append( inst ) elif isinstance( inst, declarations.enumeration_t ): - enums.append( inst ) + enums.append( inst ) + elif isinstance( inst, ( declarations.class_t, declarations.class_declaration_t ) ): + classes.append( inst ) + elif isinstance( inst, declarations.constructor_t ): + constructors.append( inst ) else: - others.append( inst ) - new_ordered = enums + others.append( inst ) + #this will prevent from py++ to change the order of generated code + cmp_by_name = lambda d1, d2: cmp( d1.name, d2.name ) + cmp_by_line = lambda d1, d2: cmp( d1.location.line, d2.location.line ) + + enums.sort( cmp=cmp_by_name ) + others.sort( cmp=cmp_by_name ) + variables.sort( cmp=cmp_by_name ) + constructors.sort( cmp=cmp_by_line ) + + new_ordered = [] + new_ordered.extend( enums ) + new_ordered.extend( classes ) + new_ordered.extend( constructors ) new_ordered.extend( others ) new_ordered.extend( variables ) return new_ordered # @@ -168,7 +186,7 @@ return ordered_members def _does_class_have_smth_to_export(self, exportable_members ): - return bool( self._filter_decls( self._reorder_decls( exportable_members ) ) ) + return bool( self._filter_decls( exportable_members ) ) def _is_constructor_of_abstract_class( self, decl ): assert isinstance( decl, declarations.constructor_t ) @@ -242,8 +260,11 @@ if self.__is_same_func( f, f_defined ): break else: - not_reimplemented_funcs.add( f ) - return not_reimplemented_funcs + not_reimplemented_funcs.add( f ) + functions = list( not_reimplemented_funcs ) + functions.sort( cmp=lambda f1, f2: cmp( ( f1.name, f1.location.as_tuple() ) + , ( f2.name, f2.location.as_tuple() ) ) ) + return functions def _is_wrapper_needed(self, class_inst, exportable_members): if isinstance( self.curr_decl, declarations.class_t ) \ @@ -657,7 +678,7 @@ self.curr_code_creator.adopt_creator( class_inst ) self.curr_code_creator = class_inst - for decl in self._filter_decls( self._reorder_decls( exportable_members ) ): + for decl in exportable_members: self.curr_decl = decl declarations.apply_visitor( self, decl ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-23 19:58:54
|
Revision: 337 Author: roman_yakovenko Date: 2006-07-23 12:58:46 -0700 (Sun, 23 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=337&view=rev Log Message: ----------- adding new functionality for class_multiple_writers.py Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-07-23 18:50:43 UTC (rev 336) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-07-23 19:58:46 UTC (rev 337) @@ -42,14 +42,16 @@ return True return bool( filter( lambda cc: not cc.works_on_instance, self.creators ) ) + @property + def typedef_name( self ): + return self.class_var_name + '_t' def _generate_code_with_scope(self): result = [] scope_var_name = self.alias + '_scope' - typedef_name = self.class_var_name + '_t' - result.append( 'typedef ' + self._generate_class_definition() + ' ' + typedef_name + ';') - result.append( typedef_name + ' ' + self.class_var_name ) - result[-1] = result[-1] + ' = '+ typedef_name + '("%s");' % self.declaration.alias + result.append( 'typedef ' + self._generate_class_definition() + ' ' + self.typedef_name + ';') + result.append( self.typedef_name + ' ' + self.class_var_name ) + result[-1] = result[-1] + ' = '+ self.typedef_name + '("%s");' % self.declaration.alias result.append( algorithm.create_identifier( self, '::boost::python::scope' ) ) result[-1] = result[-1] + ' ' + scope_var_name @@ -241,17 +243,25 @@ def _get_class_var_name(self): return self.alias + '_exposer' class_var_name = property( _get_class_var_name ) + + @property + def typedef_name( self ): + return self.class_var_name + '_t' + def create_typedef_code( self ): + base_classes, base_creators = self._exported_base_classes() + return 'typedef ' + self._generate_class_definition(base_creators) + ' ' + self.typedef_name + ';' + + def _generate_code_with_scope(self): result = [] scope_var_name = self.alias + '_scope' - typedef_name = self.class_var_name + '_t' base_classes, base_creators = self._exported_base_classes() - result.append( 'typedef ' + self._generate_class_definition(base_creators) + ' ' + typedef_name + ';') - result.append( typedef_name + ' ' + self.class_var_name ) + result.append( 'typedef ' + self._generate_class_definition(base_creators) + ' ' + self.typedef_name + ';') + result.append( self.typedef_name + ' ' + self.class_var_name ) result[-1] = result[-1] + ' = ' class_constructor, used_init = self._generate_constructor() - result[-1] = result[-1] + typedef_name + class_constructor + result[-1] = result[-1] + self.typedef_name + class_constructor result[-1] = result[-1] + ';' result.append( algorithm.create_identifier( self, '::boost::python::scope' ) ) Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-07-23 18:50:43 UTC (rev 336) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-07-23 19:58:46 UTC (rev 337) @@ -67,13 +67,40 @@ self.split_header_names.append(header_name) self.split_method_names.append(function_name) - def write_wrapper( self, class_creator ): - code = '' + def write_wrapper( self, class_creator ): + answer = [] + if self.extmodule.license: + answer.append( self.extmodule.license.create() ) + + # Include all 'global' include files... + include_creators = filter( lambda creator: isinstance( creator, code_creators.include_t ) + , self.extmodule.creators ) + includes = map( lambda include_creator: include_creator.create() + , include_creators ) + + # Write all 'global' namespace_alias_t and namespace_using_t creators first... + affect_creators = filter( lambda x: isinstance( x, code_creators.namespace_alias_t ) + or isinstance( x, code_creators.namespace_using_t ) + , self.extmodule.creators ) + + affect_creators.extend( filter( lambda x: isinstance( x, code_creators.namespace_alias_t ) + or isinstance( x, code_creators.namespace_using_t ) + , self.extmodule.body.creators ) ) + + namespace_aliases = map( lambda creator: creator.create(), affect_creators ) + if namespace_aliases: + answer.append( '' ) + answer.append( os.linesep.join(namespace_aliases) ) + if class_creator.wrapper: - code = class_creator.wrapper.create() - class_creator.wrapper.create = lambda: '' + answer.append( class_creator.wrapper.create() ) + class_creator.wrapper.create = lambda: '' + + answer.append( '' ) + answer.append( class_creator.create_typedef_code() ) - wrapper_code = self.create_header( class_creator.alias + '_wrapper', code ) + code = os.linesep.join( answer ) + wrapper_code = self.create_header( class_creator.alias + '_wrapper', code ) header_file = os.path.join( self.directory_path, class_creator.alias, 'wrapper' + self.HEADER_EXT ) self.write_file( header_file, wrapper_code ) @@ -132,9 +159,10 @@ def split_class_impl( self, class_creator): if not class_creator.declaration in self.huge_classes: return super( class_multiple_files_t, self ).split_class_impl( class_creator ) - + + class_creator.declaration.always_expose_using_scope = True extmodule = class_creator.top_parent - + self.create_dir( os.path.join( self.directory_path, class_creator.alias ) ) function_name = 'register_%s_class' % class_creator.alias This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-24 14:33:58
|
Revision: 339 Author: roman_yakovenko Date: 2006-07-24 07:33:50 -0700 (Mon, 24 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=339&view=rev Log Message: ----------- adding functionality for "huge classes" feature Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-07-24 09:06:59 UTC (rev 338) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-07-24 14:33:50 UTC (rev 339) @@ -31,9 +31,9 @@ self.internal_splitters = [ self.split_internal_enums , self.split_internal_unnamed_enums - #, self.split_internal_member_functions + , self.split_internal_member_functions , self.split_internal_classes - #, self.split_internal_member_variables + , self.split_internal_member_variables ] def split_class_impl( self, class_creator): @@ -67,31 +67,18 @@ self.split_header_names.append(header_name) self.split_method_names.append(function_name) + def wrapper_header( self, class_creator ): + return os.path.join( class_creator.alias, 'wrapper' + self.HEADER_EXT ) + def write_wrapper( self, class_creator ): answer = [] if self.extmodule.license: answer.append( self.extmodule.license.create() ) - - # Include all 'global' include files... - include_creators = filter( lambda creator: isinstance( creator, code_creators.include_t ) - , self.extmodule.creators ) - includes = map( lambda include_creator: include_creator.create() - , include_creators ) - - # Write all 'global' namespace_alias_t and namespace_using_t creators first... - affect_creators = filter( lambda x: isinstance( x, code_creators.namespace_alias_t ) - or isinstance( x, code_creators.namespace_using_t ) - , self.extmodule.creators ) + + answer.append( self.create_include_code( [class_creator] ) ) + answer.append( '' ) + answer.append( self.create_namespaces_code( [class_creator] ) ) - affect_creators.extend( filter( lambda x: isinstance( x, code_creators.namespace_alias_t ) - or isinstance( x, code_creators.namespace_using_t ) - , self.extmodule.body.creators ) ) - - namespace_aliases = map( lambda creator: creator.create(), affect_creators ) - if namespace_aliases: - answer.append( '' ) - answer.append( os.linesep.join(namespace_aliases) ) - if class_creator.wrapper: answer.append( class_creator.wrapper.create() ) class_creator.wrapper.create = lambda: '' @@ -101,28 +88,54 @@ code = os.linesep.join( answer ) wrapper_code = self.create_header( class_creator.alias + '_wrapper', code ) - header_file = os.path.join( self.directory_path, class_creator.alias, 'wrapper' + self.HEADER_EXT ) + header_file = os.path.join( self.directory_path, self.wrapper_header(class_creator) ) self.write_file( header_file, wrapper_code ) def split_internal_creators( self, class_creator, creators, pattern ): file_path = os.path.join( self.directory_path , class_creator.alias , pattern ) - - function_name = 'register_%s_%s' % ( class_creator.alias, pattern ) + + function_name = 'register_%(cls_alias)s_%(pattern)s' \ + % { 'cls_alias' : class_creator.alias, 'pattern' : pattern } + + function_decl = 'void %(fname)s( %(exposer_type)s& %(var_name)s )' \ + % { 'fname' : function_name + , 'exposer_type' : class_creator.typedef_name + , 'var_name' : class_creator.class_var_name } + + #writting header file + header_code = [ '#include "%s"' % self.wrapper_header( class_creator ) ] + header_code.append( '' ) + header_code.append( function_decl + ';' ) + self.write_file( file_path + self.HEADER_EXT + , self.create_header( pattern, os.linesep.join(header_code) ) ) - self.write_file( file_path + self.HEADER_EXT - , self.create_header( pattern, self.create_function_code( function_name ) ) ) + #writting source file + source_code = [] + if self.extmodule.license: + source_code.append( self.extmodule.license.create() ) + + head_headers = [ file_path + self.HEADER_EXT ]#relevant header file + tail_headers = [ self.wrapper_header(class_creator) ] + source_code.append( self.create_include_code( creators, head_headers, tail_headers ) ) - self.write_file( file_path + self.SOURCE_EXT - , self.create_source( pattern - , function_name - , creators )) + source_code.append( '' ) + source_code.append( self.create_namespaces_code( creators ) ) + + # Write the register() function... + source_code.append( '' ) + source_code.append( '%s{' % function_decl ) + source_code.append( '' ) for index, creator in enumerate( creators ): + source_code.append( code_creators.code_creator_t.indent( creator.create() ) ) + source_code.append( '' ) if 0 == index: - creator.create = lambda: function_name + '();' - else: - creator.create = lambda: '' + creator.create = lambda: function_name + '(%s);' % class_creator.class_var_name + else: + creator.create = lambda: '' + source_code.append( '}' ) + self.write_file( file_path + self.SOURCE_EXT, os.linesep.join( source_code ) ) def split_internal_enums( self, class_creator ): """Write all enumerations into a separate .h/.cpp file. @@ -174,30 +187,32 @@ , self.create_function_code( function_name ) ) ) self.write_wrapper( class_creator ) - wrapper_include = code_creators.include_t( os.path.join( class_creator.alias, 'wrapper' + self.HEADER_EXT ) ) - extmodule.adopt_include( wrapper_include ) - - include_creators = [ wrapper_include ] - splitter_includes = [] + tail_headers = [] for splitter in self.internal_splitters: pattern = splitter( class_creator ) - include_creator = code_creators.include_t( os.path.join( class_creator.alias, pattern + self.HEADER_EXT ) ) - splitter_includes.append( include_creator ) + tail_headers.append( os.path.join( class_creator.alias, pattern + self.HEADER_EXT ) ) - for creator in splitter_includes: - extmodule.adopt_include( creator ) + #writting source file + source_code = [] + if self.extmodule.license: + source_code.append( self.extmodule.license.create() ) + + source_code.append( self.create_include_code( [class_creator], tail_headers=tail_headers ) ) - # Write the .cpp file... - cpp_code = self.create_source( class_creator.alias - , function_name - , [class_creator] ) - - self.write_file( file_path + self.SOURCE_EXT, cpp_code ) - - extmodule.remove_creator( wrapper_include ) - for creator in splitter_includes: - extmodule.remove_creator( creator ) + source_code.append( '' ) + source_code.append( self.create_namespaces_code( [class_creator] ) ) + + # Write the register() function... + source_code.append( '' ) + source_code.append( 'void %s{' % function_name ) + source_code.append( '' ) + for creator in class_creator.creators: + source_code.append( code_creators.code_creator_t.indent( creator.create() ) ) + source_code.append( '' ) + source_code.append( '}' ) + self.write_file( file_path + self.SOURCE_EXT, os.linesep.join( source_code ) ) + # Replace the create() method so that only the register() method is called # (this is called later for the main source file). class_creator.create = lambda: function_name +'();' Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-07-24 09:06:59 UTC (rev 338) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-07-24 14:33:50 UTC (rev 339) @@ -90,7 +90,38 @@ return None value_class = class_traits.get_declaration( element_type ) return self.create_value_traits_header_name( value_class ) - + + def create_include_code( self, creators, head_headers=None, tail_headers=None ): + answer = [] + if head_headers: + answer.extend( map( lambda header: '#include "%s"' % header, head_headers ) ) + + # Include all 'global' include files... + includes = filter( lambda creator: isinstance( creator, code_creators.include_t ) + , self.extmodule.creators ) + answer.extend( map( lambda creator: creator.create(), includes ) ) + + for creator in creators: + header = self.find_out_value_traits_header( creator ) + if header: + answer.append( '#include "%s"' % header ) + + if tail_headers: + answer.extend( map( lambda header: '#include "%s"' % header, tail_headers ) ) + + return os.linesep.join( answer ) + + def create_namespaces_code( self, creators ): + # Write all 'global' namespace_alias_t and namespace_using_t creators first... + ns_types = ( code_creators.namespace_alias_t, code_creators.namespace_using_t ) + ns_creators = filter( lambda x: isinstance( x, ns_types ), self.extmodule.creators ) + + ns_creators.extend( filter( lambda x: isinstance( x, ns_types ), self.extmodule.body.creators ) ) + if not ns_creators: + return '' + else: + return os.linesep.join( map( lambda creator: creator.create(), ns_creators ) ) + def create_source( self, file_name, function_name, registration_creators, declaration_creators=None ): """Return the content of a cpp file. @@ -111,35 +142,13 @@ answer = [] if self.extmodule.license: answer.append( self.extmodule.license.create() ) - - answer.append( '#include "%s%s"' % ( file_name, self.HEADER_EXT ) ) - - # Include all 'global' include files... - include_creators = filter( lambda creator: isinstance( creator, code_creators.include_t ) - , self.extmodule.creators ) - includes = map( lambda include_creator: include_creator.create() - , include_creators ) - - for creator in registration_creators: - value_traits_header = self.find_out_value_traits_header( creator ) - if value_traits_header: - includes.append( '#include "%s"' % value_traits_header ) - answer.append( os.linesep.join(includes) ) - - # Write all 'global' namespace_alias_t and namespace_using_t creators first... - affect_creators = filter( lambda x: isinstance( x, code_creators.namespace_alias_t ) - or isinstance( x, code_creators.namespace_using_t ) - , self.extmodule.creators ) - - affect_creators.extend( filter( lambda x: isinstance( x, code_creators.namespace_alias_t ) - or isinstance( x, code_creators.namespace_using_t ) - , self.extmodule.body.creators ) ) - - namespace_aliases = map( lambda creator: creator.create(), affect_creators ) - if namespace_aliases: - answer.append( '' ) - answer.append( os.linesep.join(namespace_aliases) ) - + + head_headers = [ file_name + self.HEADER_EXT ] + answer.append( self.create_include_code( creators, head_headers ) ) + + answer.append( '' ) + answer.append( self.create_namespaces_code( creators ) ) + # Write wrapper classes... for creator in declaration_creators: answer.append( '' ) @@ -147,7 +156,8 @@ # Write the register() function... answer.append( '' ) - answer.append( 'void %s(){' % function_name ) + answer.append( 'void %s(){' % function_name ) + answer.append( '' ) for creator in registration_creators: answer.append( code_creators.code_creator_t.indent( creator.create() ) ) answer.append( '' ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-25 14:20:37
|
Revision: 346 Author: roman_yakovenko Date: 2006-07-25 07:20:27 -0700 (Tue, 25 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=346&view=rev Log Message: ----------- fixing errors in splitting huge class to files functionality Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-07-25 06:25:20 UTC (rev 345) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-07-25 14:20:27 UTC (rev 346) @@ -274,13 +274,17 @@ for x in creators: if x is used_init: - continue + continue if isinstance( x, calldef.calldef_t ): x.works_on_instance = False - result.append( x.create() ) + code = x.create() + if code: + result.append( code ) continue - if not x.works_on_instance: - result.append( x.create() ) + if not x.works_on_instance: + code = x.create() + if code: + result.append( code ) else: result.append( '%s.%s;' % ( self.class_var_name, x.create() ) ) Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-07-25 06:25:20 UTC (rev 345) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-07-25 14:20:27 UTC (rev 346) @@ -31,8 +31,11 @@ self.internal_splitters = [ self.split_internal_enums , self.split_internal_unnamed_enums - , self.split_internal_member_functions - , self.split_internal_classes + , self.split_internal_classes + , self.split_internal_memfuns + , self.split_internal_v_memfuns + , self.split_internal_pv_memfuns + , self.split_internal_protected_memfuns #not supported yet #, self.split_internal_member_variables ] @@ -69,7 +72,9 @@ self.split_method_names.append(function_name) def wrapper_header( self, class_creator ): - return os.path.join( class_creator.alias, 'wrapper' + self.HEADER_EXT ) + normalize = code_creators.include_directories_t.normalize + tmp = os.path.join( class_creator.alias, 'wrapper' + self.HEADER_EXT ) + return normalize( tmp ) def write_wrapper( self, class_creator ): answer = [] @@ -152,15 +157,36 @@ , class_creator.creators ) self.split_internal_creators( class_creator, creators, 'unnamed_enums' ) return 'unnamed_enums' - - def split_internal_member_functions( self, class_creator ): - creators = filter( lambda x: isinstance(x, code_creators.mem_fun_t ) - , class_creator.creators ) - for creator in creators: - creator.works_on_instance = False - self.split_internal_creators( class_creator, creators, 'memfuns' ) - return 'memfuns' + def split_internal_calldefs( self, class_creator, calldef_types, pattern ): + creators = filter( lambda x: isinstance(x, calldef_types ), class_creator.creators ) + for creator in creators: + creator.works_on_instance = False + self.split_internal_creators( class_creator, creators, pattern ) + return pattern + + def split_internal_memfuns( self, class_creator ): + calldef_types = ( code_creators.mem_fun_t ) + return self.split_internal_calldefs( class_creator, calldef_types, 'memfuns' ) + + def split_internal_v_memfuns( self, class_creator ): + calldef_types = ( code_creators.mem_fun_v_t ) + return self.split_internal_calldefs( class_creator, calldef_types, 'memfuns_virtual' ) + + def split_internal_pv_memfuns( self, class_creator ): + calldef_types = ( code_creators.mem_fun_pv_t ) + return self.split_internal_calldefs( class_creator, calldef_types, 'memfuns_pvirtual' ) + + def split_internal_protected_memfuns( self, class_creator ): + calldef_types = ( + code_creators.mem_fun_protected_t + , code_creators.mem_fun_protected_s_t + , code_creators.mem_fun_protected_v_t + , code_creators.mem_fun_protected_pv_t ) + + return self.split_internal_calldefs( class_creator, calldef_types, 'protected_memfuns' ) + + def split_internal_classes( self, class_creator ): class_types = ( code_creators.class_t, code_creators.class_declaration_t ) creators = filter( lambda x: isinstance(x, class_types ), class_creator.creators ) @@ -209,11 +235,10 @@ # Write the register() function... source_code.append( '' ) - source_code.append( 'void %s{' % function_name ) + source_code.append( 'void %s(){' % function_name ) source_code.append( '' ) - for creator in class_creator.creators: - source_code.append( code_creators.code_creator_t.indent( creator.create() ) ) - source_code.append( '' ) + source_code.append( class_creator.create() ) + source_code.append( '' ) source_code.append( '}' ) self.write_file( file_path + self.SOURCE_EXT, os.linesep.join( source_code ) ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-08-16 02:21:04
|
Revision: 407 Author: roman_yakovenko Date: 2006-08-15 19:20:54 -0700 (Tue, 15 Aug 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=407&view=rev Log Message: ----------- Updating documentation Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py 2006-08-15 15:10:44 UTC (rev 406) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py 2006-08-16 02:20:54 UTC (rev 407) @@ -17,6 +17,11 @@ # 5. shared_ptr class indexing_suite1_t( object ): + """ + This class helps user to export STD containers, using Boost.Python + indexing suite V2. + """ + def __init__( self, container_class, container_traits, no_proxy=None, derived_policies=None ): object.__init__( self ) self.__no_proxy = no_proxy @@ -26,11 +31,13 @@ def _get_container_class( self ): return self.__container_class - container_class = property( _get_container_class ) + container_class = property( _get_container_class + , doc="Reference to STD container class" ) def _get_element_type(self): return self.__container_traits.element_type( self.container_class ) - element_type = property( _get_element_type ) + element_type = property( _get_element_type + , doc="Reference to container value_type( mapped_type ) type" ) def _get_no_proxy( self ): if self.__no_proxy is None: @@ -48,11 +55,17 @@ def _set_no_proxy( self, no_proxy ): self.__no_proxy = no_proxy - no_proxy = property( _get_no_proxy, _set_no_proxy ) + no_proxy = property( _get_no_proxy, _set_no_proxy + , doc="NoProxy value, the initial value depends on container" + +" element_type( mapped_type ) type. In most cases, " + +"Py++ is able to guess this value, right. If you are not " + +"lucky, you will have to set the property value.") def _get_derived_policies( self ): return self.__derived_policies def _set_derived_policies( self, derived_policies ): self.__derived_policies = derived_policies - derived_policies = property( _get_derived_policies, _set_derived_policies ) + derived_policies = property( _get_derived_policies, _set_derived_policies + , doc="This proprty contains DerivedPolicies string. " + +"It will be added as is to the generated code.") \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-08-15 15:10:44 UTC (rev 406) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-08-16 02:20:54 UTC (rev 407) @@ -31,10 +31,19 @@ class indexing_suite2_t( object ): + """ + This class helps user to export STD containers, using Boost.Python + indexing suite V2. + """ + + #List of method names. These method could be excluded from being exposed. METHODS = ( 'len', 'iter', 'getitem', 'getitem_slice', 'index', 'contains' , 'count', 'has_key', 'setitem', 'setitem_slice', 'delitem' , 'delitem_slice', 'reverse', 'append', 'insert', 'extend', 'sort' ) + #Dictionary of method group names. These method groups could be excluded from + #being exposed. Dictionary key is a method group name. Dictionary value is a + #list of all methods, which belong to the group. METHOD_GROUPS = { 'slice' : ( 'method_getitem_slice', 'method_setitem_slice', 'method_delitem_slice' ) , 'search' : ( 'method_index', 'method_contains', 'method_count', 'method_has_key' ) @@ -53,22 +62,27 @@ def _get_container_class( self ): return self.__container_class - container_class = property( _get_container_class ) + container_class = property( _get_container_class + , doc="Reference to STD container class" ) def _get_container_traits( self ): return self._get_container_traits() - container_traits = property( _get_container_traits ) + container_traits = property( _get_container_traits + , doc="Reference to container traits. See " + "pygccxml documentation for STD container traits.") def _get_element_type(self): return self.__container_traits.element_type( self.container_class ) - element_type = property( _get_element_type ) + element_type = property( _get_element_type + , doc="Reference to container value_type( mapped_type ) type" ) def _get_call_policies( self ): #TODO find out call policies return self.__call_policies def _set_call_policies( self, call_policies ): self.__call_policies = call_policies - call_policies = property( _get_call_policies, _set_call_policies ) + call_policies = property( _get_call_policies, _set_call_policies + , "Call policies, that should be used by Boost.Python container classes.") def __apply_defaults_if_needed( self ): if self._default_applied: @@ -79,11 +93,13 @@ pass def disable_method( self, method_name ): + """Disable method from being exposed""" assert method_name in self.METHODS self.__apply_defaults_if_needed() self._disabled_methods.add( method_name ) def enable_method( self, method_name ): + """Enable method to be exposed""" assert method_name in self.METHODS self.__apply_defaults_if_needed() if method_name in self._disabled_methods: @@ -92,14 +108,17 @@ def _get_disabled_methods( self ): self.__apply_defaults_if_needed() return self._disabled_methods - disable_methods = property( _get_disabled_methods ) + disable_methods = property( _get_disabled_methods + , doc="list of all disabled methods") def disable_methods_group( self, group_name ): + """Disable methods group from being exposed""" assert group_name in self.METHOD_GROUPS self.__apply_defaults_if_needed() self._disabled_groups.add( group_name ) def enable_methods_group( self, group_name ): + """Enable methods group to be exposed""" assert group_name in self.METHOD_GROUPS self.__apply_defaults_if_needed() if group_name in self._disabled_groups: @@ -108,4 +127,5 @@ def _get_disabled_methods_groups( self ): self.__apply_defaults_if_needed() return self._disabled_groups - disabled_methods_groups = property( _get_disabled_methods_groups ) \ No newline at end of file + disabled_methods_groups = property( _get_disabled_methods_groups + , doc="list of all disabled methods group") \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2006-08-15 15:10:44 UTC (rev 406) +++ pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2006-08-16 02:20:54 UTC (rev 407) @@ -7,6 +7,9 @@ import decl_wrapper class variable_t(decl_wrapper.decl_wrapper_t, declarations.variable_t): + + """This class helps user to expose member and global variables.""" + def __init__(self, *arguments, **keywords): declarations.variable_t.__init__(self, *arguments, **keywords ) decl_wrapper.decl_wrapper_t.__init__( self ) @@ -38,8 +41,6 @@ , doc=__call_policies_doc__ ) def _exportable_impl( self ): - #if not isinstance( self.parent, declarations.class_t ): - # return '' if not self.name: return "Py++ can not expose unnamed variables" if self.bits == 0 and self.name == "": Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-08-15 15:10:44 UTC (rev 406) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-08-16 02:20:54 UTC (rev 407) @@ -25,6 +25,10 @@ @type extmodule: module_t @param directory_path: The output directory where the source files are written @type directory_path: str + + @param write_main: if it is True, the class will write out a main file + that calls all the registration methods. + @type write_main: boolean """ writer.writer_t.__init__(self, extmodule) self.__directory_path = directory_path @@ -294,11 +298,10 @@ def write(self): """ Write out the module. Creates a separate source/header combo for each class and for enums, globals, - and free functions. - If write_main is True it writes out a main file that calls all the registration methods. - After this call split_header_names and split_method_names will contain - all the header files and registration methods used. This can be used by - user code to create custom registration methods if main is not written. + and free functions. Post-condition: split_header_names and split_method_names + variables, will contain all the header files and registration methods + used. This can be used by user code to create custom registration + methods if main is not written. """ self.write_code_repository( self.__directory_path ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-08-30 10:16:12
|
Revision: 496 Author: roman_yakovenko Date: 2006-08-30 03:15:59 -0700 (Wed, 30 Aug 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=496&view=rev Log Message: ----------- rename user_declarations to associated_decl_creators for better reflection of the variable meaning Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/module_creator/creator.py Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-08-30 10:04:41 UTC (rev 495) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-08-30 10:15:59 UTC (rev 496) @@ -86,7 +86,7 @@ scoped.scoped_t.__init__( self, declaration=class_inst ) self._wrapper = wrapper self.works_on_instance = False - self._user_declarations = [] + self._associated_decl_creators = [] def _get_wrapper( self ): return self._wrapper @@ -95,9 +95,9 @@ wrapper = property( _get_wrapper, _set_wrapper ) @property - def user_declarations( self ): + def associated_decl_creators( self ): """ references to class declaration code creators. """ - return self._user_declarations + return self._associated_decl_creators def _get_held_type(self): return self.declaration.held_type Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-08-30 10:04:41 UTC (rev 495) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-08-30 10:15:59 UTC (rev 496) @@ -221,7 +221,7 @@ source_code.append( '' ) source_code.append( self.create_namespaces_code( [class_creator] ) ) - for creator in class_creator.user_declarations: + for creator in class_creator.associated_decl_creators: source_code.append( '' ) source_code.append( creator.create() ) creator.create = lambda: '' Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-08-30 10:04:41 UTC (rev 495) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-08-30 10:15:59 UTC (rev 496) @@ -194,7 +194,7 @@ class_wrapper = None decl_creators = [] if isinstance( class_creator, code_creators.class_t ): - decl_creators.extend( class_creator.user_declarations ) + decl_creators.extend( class_creator.associated_decl_creators ) if class_creator.wrapper: class_wrapper = class_creator.wrapper decl_creators.append( class_creator.wrapper ) Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-08-30 10:04:41 UTC (rev 495) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-08-30 10:15:59 UTC (rev 496) @@ -443,7 +443,7 @@ uc_creators = map( lambda uc: ctext_t( uc.text ), cls_decl.declaration_code ) insert_pos = self.__extmodule.creators.index( self.__module_body ) self.__extmodule.adopt_creators( uc_creators, insert_pos ) - cls_creator.user_declarations.extend( uc_creators ) + cls_creator.associated_decl_creators.extend( uc_creators ) def _treat_indexing_suite( self ): global INDEXING_SUITE_1_CONTAINERS @@ -725,7 +725,7 @@ overloads_cls_creator = code_creators.mem_fun_overloads_class_t( overloads ) self.__extmodule.adopt_declaration_creator( overloads_cls_creator ) - cls_creator.user_declarations.append( overloads_cls_creator ) + cls_creator.associated_decl_creators.append( overloads_cls_creator ) overloads_reg = code_creators.mem_fun_overloads_t( overloads_cls_creator ) cls_creator.adopt_creator( overloads_reg ) @@ -789,7 +789,7 @@ if cls_decl.exception_translation_code: translator = code_creators.exception_translator_t( cls_decl ) self.__extmodule.adopt_declaration_creator( translator ) - cls_cc.user_declarations.append( translator ) + cls_cc.associated_decl_creators.append( translator ) translator_register \ = code_creators.exception_translator_register_t( cls_decl, translator ) cls_cc.adopt_creator( translator_register ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-04-18 06:22:36
|
Revision: 998 http://svn.sourceforge.net/pygccxml/?rev=998&view=rev Author: roman_yakovenko Date: 2007-04-17 23:22:31 -0700 (Tue, 17 Apr 2007) Log Message: ----------- adding handling user defined header files to "multiple files writer" Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/file_writers/single_file.py pyplusplus_dev/pyplusplus/file_writers/writer.py Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2007-04-17 21:07:13 UTC (rev 997) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2007-04-18 06:22:31 UTC (rev 998) @@ -164,7 +164,10 @@ answer.append( include_cc.create() ) else:# user header file - always include answer.append( include_cc.create() ) - + + map( lambda user_header: answer.append( '#include "%s"' % user_header ) + , self.get_user_headers( creators ) ) + for creator in creators: header = self.find_out_value_traits_header( creator ) if header: Modified: pyplusplus_dev/pyplusplus/file_writers/single_file.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/single_file.py 2007-04-17 21:07:13 UTC (rev 997) +++ pyplusplus_dev/pyplusplus/file_writers/single_file.py 2007-04-18 06:22:31 UTC (rev 998) @@ -7,7 +7,6 @@ import os import writer -from pyplusplus import code_creators class single_file_t(writer.writer_t): """generates all code into single cpp file""" @@ -21,14 +20,9 @@ file_name = property( _get_file_name ) def write(self): - user_headers = [] - creators = filter( lambda creator: isinstance( creator, code_creators.declaration_based_t ) - , code_creators.make_flatten( self.extmodule ) ) - map( lambda creator: user_headers.extend( creator.get_user_headers() ) - , creators ) - user_headers = code_creators.code_creator_t.unique_headers( user_headers ) + headers = self.get_user_headers( [self.extmodule] ) map( lambda header: self.extmodule.add_include( header ) - , user_headers ) + , headers ) self.write_code_repository( os.path.split( self.file_name )[0] ) self.write_file( self.file_name, self.extmodule.create() ) - \ No newline at end of file + Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2007-04-17 21:07:13 UTC (rev 997) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2007-04-18 06:22:31 UTC (rev 998) @@ -8,6 +8,7 @@ import os import time from pyplusplus import _logging_ +from pyplusplus import code_creators from pyplusplus import code_repository class writer_t(object): @@ -98,4 +99,11 @@ f.write( fcontent_new ) f.close() writer_t.logger.info( 'file "%s" - updated( %f seconds )' % ( fname, time.clock() - start_time ) ) - + + def get_user_headers( self, creators ): + headers = [] + creators = filter( lambda creator: isinstance( creator, code_creators.declaration_based_t ) + , creators ) + map( lambda creator: headers.extend( creator.get_user_headers() ) + , creators ) + return code_creators.code_creator_t.unique_headers( headers ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-06-21 19:05:23
|
Revision: 1067 http://svn.sourceforge.net/pygccxml/?rev=1067&view=rev Author: roman_yakovenko Date: 2007-06-21 12:05:25 -0700 (Thu, 21 Jun 2007) Log Message: ----------- adding initial support to unicode Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/__init__.py pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/file_writers/single_file.py pyplusplus_dev/pyplusplus/file_writers/writer.py Modified: pyplusplus_dev/pyplusplus/file_writers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/__init__.py 2007-06-20 05:23:38 UTC (rev 1066) +++ pyplusplus_dev/pyplusplus/file_writers/__init__.py 2007-06-21 19:05:25 UTC (rev 1067) @@ -31,22 +31,22 @@ return True return False -def write_file( data, file_path ): +def write_file( data, file_path, encoding='ascii' ): """writes data to file""" if isinstance( data, types.StringTypes ): - writer_t.write_file( data, file_path ) + writer_t.write_file( data, file_path, encoding=encoding ) else: - sf = single_file_t( data, file_path ) + sf = single_file_t( data, file_path, encoding=encoding ) sf.write() -def write_multiple_files( extmodule, dir_path, files_sum_repository=None ): +def write_multiple_files( extmodule, dir_path, files_sum_repository=None, encoding='ascii' ): """writes extmodule to multiple files""" - mfs = multiple_files_t( extmodule, dir_path, files_sum_repository=files_sum_repository ) + mfs = multiple_files_t( extmodule, dir_path, files_sum_repository=files_sum_repository, encoding=encoding ) mfs.write() return mfs.written_files -def write_class_multiple_files( extmodule, dir_path, huge_classes, files_sum_repository ): +def write_class_multiple_files( extmodule, dir_path, huge_classes, files_sum_repository, encoding='ascii' ): """writes extmodule to multiple files and splits huge classes to few source files""" - mfs = class_multiple_files_t( extmodule, dir_path, huge_classes, files_sum_repository=files_sum_repository ) + mfs = class_multiple_files_t( extmodule, dir_path, huge_classes, files_sum_repository=files_sum_repository, encoding=encoding ) mfs.write() return mfs.written_files Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2007-06-20 05:23:38 UTC (rev 1066) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2007-06-21 19:05:25 UTC (rev 1067) @@ -34,11 +34,13 @@ , directory_path , huge_classes , num_of_functions_per_file=20 - , files_sum_repository=None ): + , files_sum_repository=None + , encoding='ascii'): multiple_files.multiple_files_t.__init__(self , extmodule , directory_path - , files_sum_repository=files_sum_repository) + , files_sum_repository=files_sum_repository + , encoding=encoding) self.huge_classes = huge_classes self.num_of_functions_per_file = num_of_functions_per_file self.internal_splitters = [ Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2007-06-20 05:23:38 UTC (rev 1066) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2007-06-21 19:05:25 UTC (rev 1067) @@ -22,7 +22,7 @@ HEADER_EXT = '.pypp.hpp' SOURCE_EXT = '.pypp.cpp' - def __init__(self, extmodule, directory_path, write_main=True, files_sum_repository=None): + def __init__(self, extmodule, directory_path, write_main=True, files_sum_repository=None, encoding='ascii'): """Constructor. @param extmodule: The root of a code creator tree @@ -34,7 +34,7 @@ that calls all the registration methods. @type write_main: boolean """ - writer.writer_t.__init__( self, extmodule, files_sum_repository ) + writer.writer_t.__init__( self, extmodule, files_sum_repository, encoding=encoding ) self.__directory_path = directory_path self.create_dir( directory_path ) self.include_creators = [] # List of include_t creators that contain the generated headers @@ -49,7 +49,7 @@ def write_file( self, fpath, content ): self.written_files.append( fpath ) - writer.writer_t.write_file( fpath, content, self.files_sum_repository ) + writer.writer_t.write_file( fpath, content, self.files_sum_repository, self.encoding ) def create_dir( self, directory_path ): """Create the output directory if it doesn't already exist. Modified: pyplusplus_dev/pyplusplus/file_writers/single_file.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/single_file.py 2007-06-20 05:23:38 UTC (rev 1066) +++ pyplusplus_dev/pyplusplus/file_writers/single_file.py 2007-06-21 19:05:25 UTC (rev 1067) @@ -11,18 +11,18 @@ class single_file_t(writer.writer_t): """generates all code into single cpp file""" - def __init__(self, extmodule, file_name): - writer.writer_t.__init__(self, extmodule) + def __init__(self, extmodule, file_name, encoding='ascii'): + writer.writer_t.__init__(self, extmodule, encoding=encoding) self.__fname = file_name - def _get_file_name(self): + @property + def file_name(self): return self.__fname - file_name = property( _get_file_name ) def write(self): headers = self.get_user_headers( [self.extmodule] ) map( lambda header: self.extmodule.add_include( header ) , headers ) self.write_code_repository( os.path.split( self.file_name )[0] ) - self.write_file( self.file_name, self.extmodule.create() ) + self.write_file( self.file_name, self.extmodule.create(), encoding=self.encoding ) Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2007-06-20 05:23:38 UTC (rev 1066) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2007-06-21 19:05:25 UTC (rev 1067) @@ -7,6 +7,7 @@ import os import time +import codecs from pyplusplus import _logging_ from pyplusplus import code_creators from pyplusplus import code_repository @@ -22,14 +23,20 @@ """ logger = _logging_.loggers.file_writer - def __init__(self, extmodule, files_sum_repository=None): + def __init__(self, extmodule, files_sum_repository=None, encoding='ascii'): object.__init__(self) self.__extmodule = extmodule self.__files_sum_repository = files_sum_repository + self.__encoding=encoding if None is files_sum_repository: self.__files_sum_repository = md5sum_repository.dummy_repository_t() - + @property + def encoding( self ): + """encoding name used to write generated code to files""" + return self.__encoding + + @property def extmodule(self): """The root of the code creator tree ( code_creators.module_t )""" return self.__extmodule @@ -63,7 +70,7 @@ self.write_file( os.path.join( dir, code_repository.named_tuple.file_name ) , code_repository.named_tuple.code ) @staticmethod - def write_file( fpath, content, files_sum_repository=None ): + def write_file( fpath, content, files_sum_repository=None, encoding='ascii' ): """Write a source file. This method writes the string content into the specified file. @@ -102,7 +109,7 @@ #It could be a first time the user uses files_sum_repository, don't force him #to recompile the code #small optimization to cut down compilation time - f = file( fpath, 'rb' ) + f = codecs.open( fpath, 'rb', encoding ) fcontent = f.read() f.close() if fcontent == fcontent_new: @@ -113,8 +120,8 @@ writer_t.logger.debug( 'file changed or it does not exist' ) writer_t.create_backup( fpath ) - f = file( fpath, 'w+b' ) - f.write( fcontent_new ) + f = codecs.open( fpath, 'w+b', encoding ) + f.write( unicode( fcontent_new, encoding ) ) f.close() if new_hash_value: files_sum_repository.update_value( fname, new_hash_value ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-11-27 20:36:55
|
Revision: 1179 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1179&view=rev Author: roman_yakovenko Date: 2007-11-27 12:37:00 -0800 (Tue, 27 Nov 2007) Log Message: ----------- small improvement to allow the users to implement precompiled header files Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2007-11-27 20:00:35 UTC (rev 1178) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2007-11-27 20:37:00 UTC (rev 1179) @@ -113,7 +113,7 @@ #relevant header file head_headers = [ self.create_base_fname( class_creator, pattern + self.HEADER_EXT ) ] - source_code.append( self.create_include_code( creators, head_headers ) ) + source_code.append( self.create_include_code( creators, tail_headers=head_headers ) ) source_code.append( '' ) source_code.append( self.create_namespaces_code( creators ) ) Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2007-11-27 20:00:35 UTC (rev 1178) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2007-11-27 20:37:00 UTC (rev 1179) @@ -227,7 +227,7 @@ answer.append( self.extmodule.license.create() ) head_headers = [ file_name + self.HEADER_EXT ] - answer.append( self.create_include_code( creators, head_headers ) ) + answer.append( self.create_include_code( creators, tail_headers=head_headers ) ) answer.append( '' ) answer.append( self.create_namespaces_code( creators ) ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |