1   
  2   
  3   
  4   
  5   
  6  """defines interface for exposing STD containers, using next version of indexing suite""" 
  7   
  8  from pygccxml import declarations 
  9  import call_policies 
 10  """ 
 11  method_len 
 12  method_iter 
 13  method_getitem 
 14  method_getitem_slice 
 15  method_index 
 16  method_contains 
 17  method_count 
 18  method_has_key 
 19  method_setitem 
 20  method_setitem_slice 
 21  method_delitem 
 22  method_delitem_slice 
 23  method_reverse 
 24  method_append 
 25  method_insert 
 26  method_extend 
 27  method_sort 
 28   
 29  slice_methods = method_getitem_slice | method_setitem_slice | method_delitem_slice 
 30  search_methods = method_index | method_contains | method_count | method_has_key 
 31  reorder_methods = method_sort | method_reverse 
 32  insert_methods = method_append | method_insert | method_extend 
 33  """ 
 34   
 35   
 36  containers = { 
 37        'vector' : "boost/python/suite/indexing/vector.hpp" 
 38      , 'deque' : "boost/python/suite/indexing/deque.hpp" 
 39      , 'list' : "boost/python/suite/indexing/list.hpp" 
 40      , 'map' : "boost/python/suite/indexing/map.hpp" 
 41      , 'multimap' : "boost/python/suite/indexing/multimap.hpp" 
 42      , 'hash_map' : "boost/python/suite/indexing/map.hpp" 
 43      , 'set' : "boost/python/suite/indexing/set.hpp" 
 44      , 'hash_set' : "boost/python/suite/indexing/set.hpp" 
 45       
 46  } 
 49      """ 
 50      This class helps user to export STD containers, using Boost.Python 
 51      indexing suite V2. 
 52      """ 
 53   
 54       
 55      METHODS = ( 'len', 'iter', 'getitem', 'getitem_slice', 'index', 'contains' 
 56                  , 'count', 'has_key', 'setitem', 'setitem_slice', 'delitem' 
 57                  , 'delitem_slice', 'reverse', 'append', 'insert', 'extend', 'sort' ) 
 58   
 59       
 60       
 61       
 62      METHOD_GROUPS = { 
 63          'slice' : ( 'method_getitem_slice', 'method_setitem_slice', 'method_delitem_slice' ) 
 64          , 'search' : ( 'method_index', 'method_contains', 'method_count', 'method_has_key' ) 
 65          , 'reorder' : ( 'method_sort', 'method_reverse' ) 
 66          , 'insert' : ( 'method_append', 'method_insert', 'method_extend' ) 
 67      } 
 68   
 70          object.__init__( self ) 
 71          self.__call_policies = None 
 72          self.__container_class = container_class 
 73          self._disabled_methods = set() 
 74          self._disabled_groups = set() 
 75          self._default_applied = False 
 76          self._use_container_suite = False 
 77          self.__include_files = None 
  78   
 80          return self._use_container_suite 
  82          self._use_container_suite = value 
  83      use_container_suite = property( get_use_container_suite, set_use_container_suite ) 
 84   
 85      @property 
 87          """reference to the parent( STD container ) class""" 
 88          return self.__container_class 
  89   
 90      @property 
 94           
 95      @property 
 99   
116   
119      call_policies = property( _get_call_policies, _set_call_policies 
120                                , "Call policies, that should be used by Boost.Python container classes.") 
121   
123          if self._default_applied: 
124              return 
125          self._default_applied = True 
126           
127           
128          pass 
 129   
131          """Disable method from being exposed""" 
132          assert method_name in self.METHODS 
133          self.__apply_defaults_if_needed() 
134          self._disabled_methods.add( method_name ) 
 135   
137          """Enable method to be exposed""" 
138          assert method_name in self.METHODS 
139          self.__apply_defaults_if_needed() 
140          if method_name in self._disabled_methods: 
141              self._disabled_methods.remove( method_name ) 
 142   
144          self.__apply_defaults_if_needed() 
145          return self._disabled_methods 
 146      disable_methods = property( _get_disabled_methods 
147                                  , doc="list of all disabled methods") 
148   
150          """Disable methods group from being exposed""" 
151          assert group_name in self.METHOD_GROUPS 
152          self.__apply_defaults_if_needed() 
153          self._disabled_groups.add( group_name ) 
 154   
156          """Enable methods group to be exposed""" 
157          assert group_name in self.METHOD_GROUPS 
158          self.__apply_defaults_if_needed() 
159          if group_name in self._disabled_groups: 
160              self._disabled_groups.remove( group_name ) 
 161   
163          self.__apply_defaults_if_needed() 
164          return self._disabled_groups 
 165      disabled_methods_groups = property( _get_disabled_methods_groups 
166                                          , doc="list of all disabled methods group") 
167   
168      @property 
170          """Return list of header files to be included in generated code""" 
171          if self.__include_files is None: 
172              name = self.container_class.name.split( '<' )[0] 
173              if name not in containers: 
174                  self.__include_files = []  
175              else: 
176                   
177                  self.__include_files = [ "boost/python/suite/indexing/container_suite.hpp" 
178                                           , containers[ name ] ] 
179          return self.__include_files 
  180