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