Branch data Line data Source code
1 : : #ifndef IS_BUILDING_MB
2 : : #error "SetIterator.hpp isn't supposed to be included into an application"
3 : : #endif
4 : :
5 : : #include "moab/SetIterator.hpp"
6 : : #include "moab/Core.hpp"
7 : : #include "moab/WriteUtilIface.hpp"
8 : : #include "MeshSet.hpp"
9 : : #include "Internals.hpp"
10 : : #include "moab/CN.hpp"
11 : : #include "moab/Error.hpp"
12 : :
13 : : namespace moab
14 : : {
15 : :
16 : 48 : SetIterator::~SetIterator()
17 : : {
18 : 48 : myCore->remove_set_iterator( this );
19 [ - + ]: 48 : }
20 : :
21 : 24 : RangeSetIterator::RangeSetIterator( Core* core, EntityHandle eset, int chunk_sz, EntityType ent_tp, int ent_dim,
22 : : bool check_valid )
23 : 24 : : SetIterator( core, eset, chunk_sz, ent_tp, ent_dim, check_valid ), iterPos( 0 ), pairPtr( NULL ), numPairs( 0 )
24 : : {
25 [ - + ]: 24 : if( !eset )
26 : : {
27 : : // special case for the root set, have to keep a local array
28 [ # # ]: 0 : ErrorCode rval = build_pair_vec();
29 [ # # ]: 0 : assert( MB_SUCCESS == rval );
30 : :
31 : : // empty statement to avoid warning
32 : : (void)( rval );
33 : : }
34 : 24 : }
35 : :
36 : 72 : RangeSetIterator::~RangeSetIterator()
37 : : {
38 [ - + ][ # # ]: 24 : if( pairPtr ) delete[] pairPtr;
39 : 24 : numPairs = 0;
40 [ - + ]: 48 : }
41 : :
42 : 0 : ErrorCode RangeSetIterator::build_pair_vec()
43 : : {
44 : : // shouldn't be here unless we're iterating the root set
45 [ # # ]: 0 : assert( !entSet );
46 : :
47 [ # # ]: 0 : Range all_ents;
48 [ # # ]: 0 : ErrorCode rval = myCore->get_entities_by_handle( 0, all_ents );
49 [ # # ]: 0 : if( MB_SUCCESS != rval ) return rval;
50 : :
51 [ # # ][ # # ]: 0 : if( pairPtr ) delete[] pairPtr;
52 [ # # ][ # # ]: 0 : pairPtr = new EntityHandle[2 * all_ents.psize()];
[ # # ]
53 [ # # ]: 0 : Range::const_pair_iterator pi;
54 : : int i;
55 [ # # ][ # # ]: 0 : for( pi = all_ents.const_pair_begin(), i = 0; pi != all_ents.const_pair_end(); ++pi, i += 2 )
[ # # ][ # # ]
[ # # ]
56 : : {
57 [ # # ]: 0 : pairPtr[i] = ( *pi ).first;
58 [ # # ]: 0 : pairPtr[i + 1] = ( *pi ).second;
59 : : }
60 [ # # ]: 0 : numPairs = all_ents.psize();
61 : :
62 : 0 : return MB_SUCCESS;
63 : : }
64 : :
65 : 375 : ErrorCode RangeSetIterator::get_next_arr( std::vector< EntityHandle >& arr, bool& atend )
66 : : {
67 : 375 : atend = false;
68 : :
69 : : int count;
70 : : const EntityHandle* ptr;
71 : : WriteUtilIface* iface;
72 [ + - ]: 375 : std::vector< EntityHandle > tmp_arr;
73 : 375 : std::vector< EntityHandle >* tmp_ptr = &arr;
74 [ - + ]: 375 : if( checkValid ) tmp_ptr = &tmp_arr;
75 : : ErrorCode rval;
76 [ + - ]: 375 : if( !pairPtr )
77 : : {
78 : 375 : Interface* mbImpl = dynamic_cast< Interface* >( myCore );
79 [ + - ]: 375 : rval = mbImpl->query_interface( iface );
80 [ - + ]: 375 : if( MB_SUCCESS != rval ) return rval;
81 : :
82 [ + - ]: 375 : rval = iface->get_entity_list_pointers( &entSet, 1, &ptr, WriteUtilIface::CONTENTS, &count );
83 [ - + ]: 375 : if( MB_SUCCESS != rval ) return rval;
84 [ + - ]: 375 : mbImpl->release_interface( iface );
85 : : }
86 : : else
87 : : {
88 [ # # ]: 0 : if( checkValid )
89 : : {
90 [ # # ]: 0 : rval = build_pair_vec();
91 [ # # ]: 0 : if( MB_SUCCESS != rval ) return rval;
92 : : }
93 : 0 : ptr = pairPtr;
94 : 0 : count = 2 * numPairs;
95 : : }
96 [ - + ]: 375 : assert( !( count % 2 ) );
97 [ + + ]: 375 : if( !count )
98 : : {
99 : 8 : atend = true;
100 : 8 : return MB_SUCCESS;
101 : : }
102 : :
103 [ + + ]: 367 : if( -1 == entDimension )
104 [ + - ]: 334 : rval = get_next_by_type( ptr, count, *tmp_ptr, atend );
105 : : else
106 [ + - ]: 33 : rval = get_next_by_dimension( ptr, count, *tmp_ptr, atend );
107 [ - + ]: 367 : if( MB_SUCCESS != rval ) return rval;
108 : :
109 [ - + ]: 367 : if( checkValid )
110 : : {
111 [ # # ][ # # ]: 0 : for( std::vector< EntityHandle >::iterator vit = tmp_ptr->begin(); vit != tmp_ptr->end(); ++vit )
[ # # ]
112 : : {
113 [ # # ][ # # ]: 0 : if( myCore->is_valid( *vit ) ) arr.push_back( *vit );
[ # # ][ # # ]
[ # # ]
114 : : }
115 : : }
116 : :
117 : 375 : return MB_SUCCESS;
118 : : }
119 : :
120 : 334 : ErrorCode RangeSetIterator::get_next_by_type( const EntityHandle*& ptr, int count, std::vector< EntityHandle >& arr,
121 : : bool& atend )
122 : : {
123 : 334 : unsigned int num_ret = 0;
124 : 334 : bool max_type = ( entType == MBMAXTYPE );
125 : 334 : size_t idx = 0;
126 : : // initialize to first relevant handle
127 [ + - ][ + + ]: 1249 : while( (int)idx < count &&
[ + + ]
128 [ + + ]: 344 : ( iterPos > ptr[idx + 1] ||
129 [ + + ][ + + ]: 180 : ( !max_type && !iterPos && CREATE_HANDLE( entType, ID_FROM_HANDLE( iterPos ) ) > ptr[idx + 1] ) ) )
130 : 571 : idx += 2;
131 [ + - ][ + + ]: 334 : if( (int)idx == count || TYPE_FROM_HANDLE( ptr[idx] ) > entType )
[ + + ]
132 : : {
133 : 2 : atend = true;
134 : 2 : return MB_SUCCESS;
135 : : }
136 [ + + ][ + + ]: 332 : if( !iterPos && max_type )
137 : 3 : iterPos = ptr[idx];
138 [ + + ][ + - ]: 329 : else if( !iterPos && TYPE_FROM_HANDLE( ptr[idx] ) <= entType && TYPE_FROM_HANDLE( ptr[idx + 1] ) >= entType )
[ + - ][ + + ]
139 : : {
140 [ + - ]: 7 : iterPos = std::max( CREATE_HANDLE( entType, 1 ), ptr[idx] );
141 : : }
142 : :
143 : : // idx points to start of subrange, iterPos in that subrange
144 [ + + ]: 338 : do
145 : : {
146 : 338 : EntityHandle next = ptr[idx + 1];
147 [ + + ][ - + ]: 338 : if( TYPE_FROM_HANDLE( next ) != entType && !max_type ) next = LAST_HANDLE( entType );
[ - + ]
148 : 338 : unsigned int this_ret = chunkSize - num_ret;
149 : 338 : unsigned int to_end = next - iterPos + 1;
150 [ + + ]: 338 : if( to_end < this_ret ) this_ret = to_end;
151 [ + - ][ + - ]: 338 : std::copy( MeshSet::hdl_iter( iterPos ), MeshSet::hdl_iter( iterPos + this_ret ), std::back_inserter( arr ) );
152 [ + + ]: 338 : if( this_ret == to_end )
153 : : {
154 : 20 : idx += 2;
155 [ + + ]: 20 : iterPos = ( (int)idx < count ? ptr[idx] : 0 );
156 : : }
157 : : else
158 : 318 : iterPos += this_ret;
159 : :
160 : 338 : num_ret += this_ret;
161 [ + + ][ + + ]: 342 : } while( (int)idx < count && num_ret < chunkSize && iterPos &&
[ + - ][ + + ]
162 [ + + ]: 4 : ( max_type || TYPE_FROM_HANDLE( iterPos ) == entType ) );
163 : :
164 [ + + ][ + + ]: 332 : if( !iterPos || ( !max_type && TYPE_FROM_HANDLE( iterPos ) != entType ) ) atend = true;
[ + + ][ + + ]
165 : :
166 : 334 : return MB_SUCCESS;
167 : : }
168 : :
169 : 33 : ErrorCode RangeSetIterator::get_next_by_dimension( const EntityHandle*& ptr, int count,
170 : : std::vector< EntityHandle >& arr, bool& atend )
171 : : {
172 : : // iterating by dimension - type should be maxtype
173 [ - + ][ # # ]: 33 : if( entType != MBMAXTYPE ) { MB_SET_ERR( MB_FAILURE, "Both dimension and type should not be set on an iterator" ); }
[ # # ][ # # ]
[ # # ][ # # ]
174 : :
175 : 33 : unsigned int num_ret = 0;
176 : 33 : size_t idx = 0;
177 : : // initialize to first relevant handle
178 [ + - ][ + + ]: 53 : while( (int)idx < count && ( iterPos > ptr[idx + 1] ||
[ + + ][ + + ]
179 [ - + ]: 4 : ( !iterPos && entDimension > CN::Dimension( TYPE_FROM_HANDLE( ptr[idx + 1] ) ) ) ) )
180 : 16 : idx += 2;
181 [ + - ][ - + ]: 33 : if( (int)idx == count || CN::Dimension( TYPE_FROM_HANDLE( ptr[idx] ) ) > entDimension )
[ - + ]
182 : : {
183 : 0 : atend = true;
184 : 0 : return MB_SUCCESS;
185 : : }
186 [ + + ]: 33 : if( !iterPos )
187 : 4 : iterPos = ptr[idx];
188 [ - + ]: 29 : else if( CN::Dimension( TYPE_FROM_HANDLE( ptr[idx] ) ) < entDimension )
189 : 0 : iterPos = CREATE_HANDLE( CN::TypeDimensionMap[entDimension].first, 1 );
190 : :
191 : : // idx points to start of subrange, iterPos in that subrange
192 [ + + ]: 35 : do
193 : : {
194 : 35 : EntityHandle next = ptr[idx + 1];
195 [ - + ]: 35 : if( CN::Dimension( TYPE_FROM_HANDLE( next ) ) != entDimension )
196 : 0 : next = LAST_HANDLE( CN::TypeDimensionMap[entDimension].second );
197 : 35 : unsigned int this_ret = chunkSize - num_ret;
198 : 35 : unsigned int to_end = next - iterPos + 1;
199 [ + + ]: 35 : if( to_end < this_ret ) this_ret = to_end;
200 [ + - ][ + - ]: 35 : std::copy( MeshSet::hdl_iter( iterPos ), MeshSet::hdl_iter( iterPos + this_ret ), std::back_inserter( arr ) );
201 [ + + ]: 35 : if( this_ret == to_end )
202 : : {
203 : 8 : idx += 2;
204 [ + - ]: 8 : iterPos = ( (int)idx < count ? ptr[idx] : 0 );
205 : : }
206 : : else
207 : 27 : iterPos += this_ret;
208 : :
209 : 35 : num_ret += this_ret;
210 [ + - ][ + + ]: 39 : } while( (int)idx < count && num_ret < chunkSize && iterPos &&
[ + - + + ]
211 : 4 : CN::Dimension( TYPE_FROM_HANDLE( iterPos ) ) == entDimension );
212 : :
213 [ + - ][ + + ]: 33 : if( !iterPos || CN::Dimension( TYPE_FROM_HANDLE( iterPos ) ) != entDimension ) atend = true;
[ + + ]
214 : :
215 : 33 : return MB_SUCCESS;
216 : : }
217 : :
218 : 0 : ErrorCode RangeSetIterator::reset()
219 : : {
220 : 0 : iterPos = 0;
221 : 0 : return MB_SUCCESS;
222 : : }
223 : :
224 : 379 : ErrorCode VectorSetIterator::get_next_arr( std::vector< EntityHandle >& arr, bool& atend )
225 : : {
226 : : int count;
227 : : const EntityHandle* ptr;
228 : : WriteUtilIface* iface;
229 : 379 : Interface* mbImpl = dynamic_cast< Interface* >( myCore );
230 [ + - ]: 379 : ErrorCode rval = mbImpl->query_interface( iface );
231 [ - + ]: 379 : if( MB_SUCCESS != rval ) return rval;
232 : :
233 [ + - ]: 379 : rval = iface->get_entity_list_pointers( &entSet, 1, &ptr, WriteUtilIface::CONTENTS, &count );
234 [ - + ]: 379 : if( MB_SUCCESS != rval ) return rval;
235 [ + - ]: 379 : mbImpl->release_interface( iface );
236 : :
237 [ + + ][ - + ]: 379 : if( !count || iterPos >= count )
238 : : {
239 : 8 : atend = true;
240 : 8 : return MB_SUCCESS;
241 : : }
242 : :
243 [ + - ]: 371 : std::vector< EntityHandle > tmp_arr;
244 : 371 : std::vector< EntityHandle >* tmp_ptr = &arr;
245 [ - + ]: 371 : if( checkValid ) tmp_ptr = &tmp_arr;
246 : :
247 : : // just get the next chunkSize entities, or as many as you can
248 : 371 : int this_ct = 0;
249 [ + + ][ + + ]: 2323 : while( this_ct < (int)chunkSize && iterPos < count )
250 : : {
251 [ + + ][ + - ]: 2440 : if( ( MBMAXTYPE == entType || TYPE_FROM_HANDLE( ptr[iterPos] ) == entType ) &&
[ + + ][ + + ]
[ + + ]
252 [ + - ][ + - ]: 488 : ( -1 == entDimension || CN::Dimension( TYPE_FROM_HANDLE( ptr[iterPos] ) ) == entDimension ) )
[ + + ]
253 : : {
254 [ + - ]: 842 : arr.push_back( ptr[iterPos] );
255 : 842 : this_ct++;
256 : : }
257 : 1952 : iterPos++;
258 : : }
259 : :
260 : 371 : atend = ( iterPos == count );
261 : :
262 [ - + ]: 371 : if( checkValid )
263 : : {
264 [ # # ][ # # ]: 0 : for( std::vector< EntityHandle >::iterator vit = tmp_ptr->begin(); vit != tmp_ptr->end(); ++vit )
[ # # ]
265 : : {
266 [ # # ][ # # ]: 0 : if( myCore->is_valid( *vit ) ) arr.push_back( *vit );
[ # # ][ # # ]
[ # # ]
267 : : }
268 : : }
269 : :
270 : : // step along list, adding entities
271 : 379 : return MB_SUCCESS;
272 : : }
273 : :
274 : 0 : ErrorCode VectorSetIterator::reset()
275 : : {
276 : 0 : iterPos = 0;
277 : 0 : return MB_SUCCESS;
278 : : }
279 : :
280 [ + - ][ + - ]: 228 : } // namespace moab
|