[pygccxml-commit] SF.net SVN: pygccxml: [353] pyplusplus_dev/unittests
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-07-27 22:34:49
|
Revision: 353 Author: roman_yakovenko Date: 2006-07-27 02:56:53 -0700 (Thu, 27 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=353&view=rev Log Message: ----------- huge classes functionality has been implemented! Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/utils/__init__.py pyplusplus_dev/unittests/algorithms_tester.py Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-07-27 07:18:46 UTC (rev 352) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-07-27 09:56:53 UTC (rev 353) @@ -10,6 +10,7 @@ from pygccxml import declarations from pyplusplus import decl_wrappers from pyplusplus import code_creators +from pyplusplus import utils as pypp_utils #TODO: to add namespace_alias_t classes class class_multiple_files_t(multiple_files.multiple_files_t): @@ -25,9 +26,10 @@ alias + _main h/cpp this class will contain main registration function. """ - def __init__(self, extmodule, directory_path, huge_classes): + def __init__(self, extmodule, directory_path, huge_classes, num_of_functions_per_file=25): multiple_files.multiple_files_t.__init__(self, extmodule, directory_path) self.huge_classes = huge_classes + self.num_of_functions_per_file = num_of_functions_per_file self.internal_splitters = [ self.split_internal_enums , self.split_internal_unnamed_enums @@ -160,10 +162,21 @@ 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 + grouped_creators = pypp_utils.split_sequence( creators, self.num_of_functions_per_file ) + if len( grouped_creators ) == 1: + for creator in creators: + creator.works_on_instance = False + self.split_internal_creators( class_creator, creators, pattern ) + return pattern + else: + patterns = [] + for index, group in enumerate( grouped_creators ): + pattern_tmp = pattern + str( index ) + patterns.append( pattern_tmp ) + for creator in group: + creator.works_on_instance = False + self.split_internal_creators( class_creator, group, pattern_tmp ) + return patterns def split_internal_memfuns( self, class_creator ): calldef_types = ( code_creators.mem_fun_t ) @@ -221,8 +234,14 @@ tail_headers = [] for splitter in self.internal_splitters: pattern = splitter( class_creator ) - tail_headers.append( os.path.join( class_creator.alias, pattern + self.HEADER_EXT ) ) - + if not pattern: + continue + if isinstance( pattern, str ): + tail_headers.append( os.path.join( class_creator.alias, pattern + self.HEADER_EXT ) ) + else: + assert( isinstance( pattern, list ) ) + for p in pattern: + tail_headers.append( os.path.join( class_creator.alias, p + self.HEADER_EXT ) ) #writting source file source_code = [] if self.extmodule.license: Modified: pyplusplus_dev/pyplusplus/utils/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/utils/__init__.py 2006-07-27 07:18:46 UTC (rev 352) +++ pyplusplus_dev/pyplusplus/utils/__init__.py 2006-07-27 09:56:53 UTC (rev 353) @@ -7,7 +7,7 @@ This module is a collection of unrelated algorithms, that works on code creators tree. """ - +import math from pygccxml import declarations from pyplusplus import code_creators @@ -38,6 +38,18 @@ for creator in creators: creator.parent.remove_creator( creator ) exclude = staticmethod( exclude ) - - - \ No newline at end of file + + +def split_sequence(seq, bucket_size): + #split sequence to buclets, where every will contain maximum bucket_size items + seq_len = len( seq ) + if seq_len <= bucket_size: + return [ seq ] + buckets = [] + num_of_buckets = int( math.ceil( float( seq_len ) / bucket_size ) ) + for i in range(num_of_buckets): + from_ = i * bucket_size + to = min( ( i + 1) * bucket_size, seq_len ) + buckets.append( seq[ from_ : to ] ) + return buckets + \ No newline at end of file Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2006-07-27 07:18:46 UTC (rev 352) +++ pyplusplus_dev/unittests/algorithms_tester.py 2006-07-27 09:56:53 UTC (rev 353) @@ -13,6 +13,7 @@ from pyplusplus import code_creators from pyplusplus import module_creator from pyplusplus import module_builder +from pyplusplus import utils as pypp_utils class indent_tester_t(unittest.TestCase): def test( self ): @@ -147,6 +148,16 @@ mb.namespace( name='::tester' ).include() mb.build_code_creator('dummy') mb.split_module( autoconfig.build_dir, [ mb.class_( '::tester::X' ) ] ) + + +class split_sequence_tester_t(unittest.TestCase): + def test(self): + seq = [ 1,2,3 ] + split = pypp_utils.split_sequence + self.failUnless( [[1],[2],[3]] == split( seq, 1 ) ) + self.failUnless( [[1,2],[3]] == split( seq, 2 ) ) + self.failUnless( [[1,2,3]] == split( seq, 3 ) ) + self.failUnless( [[1,2,3]] == split( seq, 4 ) ) def create_suite(): suite = unittest.TestSuite() @@ -157,6 +168,7 @@ suite.addTest( unittest.makeSuite(exclude_function_with_array_arg_tester_t)) suite.addTest( unittest.makeSuite(class_multiple_files_tester_t)) suite.addTest( unittest.makeSuite(readme_tester_t)) + suite.addTest( unittest.makeSuite(split_sequence_tester_t)) return suite This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |