Package pyplusplus :: Package code_creators :: Module algorithm

Source Code for Module pyplusplus.code_creators.algorithm

  1  # Copyright 2004-2008 Roman Yakovenko. 
  2  # Distributed under the Boost Software License, Version 1.0. (See 
  3  # accompanying file LICENSE_1_0.txt or copy at 
  4  # http://www.boost.org/LICENSE_1_0.txt) 
  5   
  6  """ 
  7  This module is a collection of unrelated algorithms, that works on code creators 
  8  tree. 
  9  """ 
 10   
 11  from pyplusplus.decl_wrappers.algorithm import * 
 12   
 13   
 14  import types  
 15  import namespace 
16 17 -def _make_flatten_list( creator_or_creators ):
18 import compound 19 def proceed_single( creator ): 20 answer = [ creator ] 21 if not isinstance( creator, compound.compound_t): 22 return answer 23 for internal in creator.creators: 24 if isinstance( creator, compound.compound_t): 25 answer.extend( proceed_single( internal ) ) 26 else: 27 answer.append( internal ) 28 return answer
29 30 creators = [] 31 if isinstance( creator_or_creators, types.ListType ): 32 creators.extend( creator_or_creators ) 33 else: 34 creators.append( creator_or_creators ) 35 answer = [] 36 for creator in creators: 37 answer.extend( proceed_single( creator ) ) 38 return answer 39
40 -def make_flatten_generator( creator_or_creators ):
41 import compound 42 def proceed_single( creator ): 43 yield creator 44 if not isinstance( creator, compound.compound_t): 45 return 46 for internal in creator.creators: 47 if isinstance( internal, compound.compound_t): 48 for internal_internal in proceed_single( internal ): 49 yield internal_internal 50 else: 51 yield internal
52 53 if isinstance( creator_or_creators, types.ListType ): 54 for creator in creator_or_creators: 55 for internal in proceed_single( creator ): 56 yield internal 57 else: 58 for internal in proceed_single( creator_or_creators ): 59 yield internal 60 61 """ 62 make_flatten - function that will create flat representation of code creators tree. 63 """ 64 make_flatten_list = _make_flatten_list 65 make_flatten = _make_flatten_list
66 67 -class creator_finder:
68 """ 69 This class is used as container for different find algorithms. 70 """ 71 "creator_finder - this class used as namespace" 72 73 @staticmethod
74 - def find_by_declaration( declaration_matcher, where, recursive=True ):
75 """Finds code creator by declaration. 76 declaration_matcher should be callable, that takes single argument 77 declaration, and returns True or False 78 where - code creator or list of code creators 79 This function returns a list of all relevant code creators 80 """ 81 import declaration_based #prevent cyclic import 82 search_area = where 83 if recursive: 84 search_area = make_flatten_generator( where ) 85 return filter( lambda inst: isinstance( inst, declaration_based.declaration_based_t ) \ 86 and declaration_matcher( inst.declaration ) 87 , search_area )
88 89 @staticmethod
90 - def find_by_declaration_single( declaration_matcher, where, recursive=True ):
91 answer = creator_finder.find_by_declaration( declaration_matcher, where, recursive ) 92 if len( answer ) == 1: 93 return answer[0] 94 return None
95 96 @staticmethod
97 - def find_by_class_instance( what, where, recursive=True ):
98 search_area = where 99 if recursive: 100 search_area = make_flatten_generator( where ) 101 return filter( lambda inst: isinstance( inst, what ), search_area )
102
103 -def make_id_creator( code_creator ):
104 return lambda decl_string: create_identifier( code_creator, decl_string )
105