#include <SetIterator.hpp>
Public Member Functions | |
virtual | ~RangeSetIterator () |
Destructor. More... | |
virtual ErrorCode | get_next_arr (std::vector< EntityHandle > &arr, bool &atend) |
get the next chunkSize entities Return the next chunkSize entities. More... | |
virtual ErrorCode | reset () |
reset the iterator to the beginning of the set More... | |
![]() | |
virtual | ~SetIterator () |
destructor More... | |
EntityHandle | ent_set () const |
get the ent set for this iterator More... | |
unsigned int | chunk_size () const |
get the chunk size of this iterator More... | |
EntityType | ent_type () const |
get the entity type for this iterator More... | |
int | ent_dimension () const |
get the dimension for this iterator More... | |
Protected Member Functions | |
RangeSetIterator (Core *core, EntityHandle ent_set, int chunk_size, EntityType ent_type, int ent_dimension, bool check_valid=false) | |
Constructor. More... | |
![]() | |
SetIterator (Core *core, EntityHandle eset, unsigned int chunk_sz, EntityType ent_tp, int ent_dim, bool check_valid=false) | |
Constructor. More... | |
Private Member Functions | |
ErrorCode | get_next_by_type (const EntityHandle *&ptr, int count, std::vector< EntityHandle > &arr, bool &atend) |
ErrorCode | get_next_by_dimension (const EntityHandle *&ptr, int count, std::vector< EntityHandle > &arr, bool &atend) |
ErrorCode | build_pair_vec () |
Build the special pair vector for the root set. More... | |
Private Attributes | |
EntityHandle | iterPos |
Current iterator position, 0 if at beginning. More... | |
EntityHandle * | pairPtr |
Special range pair ptr for root set. More... | |
int | numPairs |
Number of range pairs. More... | |
Friends | |
class | Core |
Additional Inherited Members | |
![]() | |
Core * | myCore |
Core instance. More... | |
EntityHandle | entSet |
handle for entity set corresponding to this iterator More... | |
unsigned int | chunkSize |
chunk size of this iterator More... | |
EntityType | entType |
entity type this iterator iterates over More... | |
int | entDimension |
dimension this iterator iterates over More... | |
bool | checkValid |
check for entity validity before returning handles More... | |
Definition at line 95 of file SetIterator.hpp.
|
virtual |
Destructor.
Definition at line 40 of file SetIterator.cpp.
41 {
42 if( pairPtr ) delete[] pairPtr;
43 numPairs = 0;
44 }
|
protected |
Constructor.
core | MOAB Core instance |
ent_set | EntitySet to which this iterator corresponds |
chunk_size | Chunk size of this iterator |
ent_type | Entity type for this iterator |
ent_dim | Entity dimension for this iterator |
Definition at line 21 of file SetIterator.cpp.
27 : SetIterator( core, eset, chunk_sz, ent_tp, ent_dim, check_valid ), iterPos( 0 ), pairPtr( NULL ), numPairs( 0 )
28 {
29 if( !eset )
30 {
31 // special case for the root set, have to keep a local array
32 ErrorCode rval = build_pair_vec();
33 assert( MB_SUCCESS == rval );
34
35 // empty statement to avoid warning
36 (void)( rval );
37 }
38 }
References build_pair_vec(), ErrorCode, and MB_SUCCESS.
|
private |
Build the special pair vector for the root set.
Definition at line 46 of file SetIterator.cpp.
47 {
48 // shouldn't be here unless we're iterating the root set
49 assert( !entSet );
50
51 Range all_ents;
52 ErrorCode rval = myCore->get_entities_by_handle( 0, all_ents );
53 if( MB_SUCCESS != rval ) return rval;
54
55 if( pairPtr ) delete[] pairPtr;
56 pairPtr = new EntityHandle[2 * all_ents.psize()];
57 Range::const_pair_iterator pi;
58 int i;
59 for( pi = all_ents.const_pair_begin(), i = 0; pi != all_ents.const_pair_end(); ++pi, i += 2 )
60 {
61 pairPtr[i] = ( *pi ).first;
62 pairPtr[i + 1] = ( *pi ).second;
63 }
64 numPairs = all_ents.psize();
65
66 return MB_SUCCESS;
67 }
References moab::Range::const_pair_begin(), moab::Range::const_pair_end(), moab::SetIterator::entSet, ErrorCode, moab::Core::get_entities_by_handle(), MB_SUCCESS, moab::SetIterator::myCore, numPairs, pairPtr, and moab::Range::psize().
Referenced by get_next_arr(), and RangeSetIterator().
|
virtual |
get the next chunkSize entities Return the next chunkSize entities.
arr | Array of entities returned. |
atend | Returns true if iterator is at the end of iterable values, otherwise false |
Implements moab::SetIterator.
Definition at line 69 of file SetIterator.cpp.
70 {
71 atend = false;
72
73 int count;
74 const EntityHandle* ptr;
75 WriteUtilIface* iface;
76 std::vector< EntityHandle > tmp_arr;
77 std::vector< EntityHandle >* tmp_ptr = &arr;
78 if( checkValid ) tmp_ptr = &tmp_arr;
79 ErrorCode rval;
80 if( !pairPtr )
81 {
82 Interface* mbImpl = dynamic_cast< Interface* >( myCore );
83 rval = mbImpl->query_interface( iface );
84 if( MB_SUCCESS != rval ) return rval;
85
86 rval = iface->get_entity_list_pointers( &entSet, 1, &ptr, WriteUtilIface::CONTENTS, &count );
87 if( MB_SUCCESS != rval ) return rval;
88 mbImpl->release_interface( iface );
89 }
90 else
91 {
92 if( checkValid )
93 {
94 rval = build_pair_vec();
95 if( MB_SUCCESS != rval ) return rval;
96 }
97 ptr = pairPtr;
98 count = 2 * numPairs;
99 }
100 assert( !( count % 2 ) );
101 if( !count )
102 {
103 atend = true;
104 return MB_SUCCESS;
105 }
106
107 if( -1 == entDimension )
108 rval = get_next_by_type( ptr, count, *tmp_ptr, atend );
109 else
110 rval = get_next_by_dimension( ptr, count, *tmp_ptr, atend );
111 if( MB_SUCCESS != rval ) return rval;
112
113 if( checkValid )
114 {
115 for( std::vector< EntityHandle >::iterator vit = tmp_ptr->begin(); vit != tmp_ptr->end(); ++vit )
116 {
117 if( myCore->is_valid( *vit ) ) arr.push_back( *vit );
118 }
119 }
120
121 return MB_SUCCESS;
122 }
References build_pair_vec(), moab::SetIterator::checkValid, moab::WriteUtilIface::CONTENTS, moab::SetIterator::entDimension, moab::SetIterator::entSet, ErrorCode, get_next_by_dimension(), get_next_by_type(), iface, moab::Core::is_valid(), MB_SUCCESS, moab::SetIterator::myCore, numPairs, pairPtr, moab::Interface::query_interface(), and moab::Interface::release_interface().
|
private |
Definition at line 175 of file SetIterator.cpp.
179 {
180 // iterating by dimension - type should be maxtype
181 if( entType != MBMAXTYPE )
182 {
183 MB_SET_ERR( MB_FAILURE, "Both dimension and type should not be set on an iterator" );
184 }
185
186 unsigned int num_ret = 0;
187 size_t idx = 0;
188 // initialize to first relevant handle
189 while( (int)idx < count && ( iterPos > ptr[idx + 1] ||
190 ( !iterPos && entDimension > CN::Dimension( TYPE_FROM_HANDLE( ptr[idx + 1] ) ) ) ) )
191 idx += 2;
192 if( (int)idx == count || CN::Dimension( TYPE_FROM_HANDLE( ptr[idx] ) ) > entDimension )
193 {
194 atend = true;
195 return MB_SUCCESS;
196 }
197 if( !iterPos )
198 iterPos = ptr[idx];
199 else if( CN::Dimension( TYPE_FROM_HANDLE( ptr[idx] ) ) < entDimension )
200 iterPos = CREATE_HANDLE( CN::TypeDimensionMap[entDimension].first, 1 );
201
202 // idx points to start of subrange, iterPos in that subrange
203 do
204 {
205 EntityHandle next = ptr[idx + 1];
206 if( CN::Dimension( TYPE_FROM_HANDLE( next ) ) != entDimension )
207 next = LAST_HANDLE( CN::TypeDimensionMap[entDimension].second );
208 unsigned int this_ret = chunkSize - num_ret;
209 unsigned int to_end = next - iterPos + 1;
210 if( to_end < this_ret ) this_ret = to_end;
211 std::copy( MeshSet::hdl_iter( iterPos ), MeshSet::hdl_iter( iterPos + this_ret ), std::back_inserter( arr ) );
212 if( this_ret == to_end )
213 {
214 idx += 2;
215 iterPos = ( (int)idx < count ? ptr[idx] : 0 );
216 }
217 else
218 iterPos += this_ret;
219
220 num_ret += this_ret;
221 } while( (int)idx < count && num_ret < chunkSize && iterPos &&
222 CN::Dimension( TYPE_FROM_HANDLE( iterPos ) ) == entDimension );
223
224 if( !iterPos || CN::Dimension( TYPE_FROM_HANDLE( iterPos ) ) != entDimension ) atend = true;
225
226 return MB_SUCCESS;
227 }
References moab::SetIterator::chunkSize, moab::CREATE_HANDLE(), moab::CN::Dimension(), moab::SetIterator::entDimension, moab::SetIterator::entType, moab::GeomUtil::first(), iterPos, moab::LAST_HANDLE(), MB_SET_ERR, MB_SUCCESS, MBMAXTYPE, moab::TYPE_FROM_HANDLE(), and moab::CN::TypeDimensionMap.
Referenced by get_next_arr().
|
private |
Definition at line 124 of file SetIterator.cpp.
128 {
129 unsigned int num_ret = 0;
130 bool max_type = ( entType == MBMAXTYPE );
131 size_t idx = 0;
132 // initialize to first relevant handle
133 while( (int)idx < count &&
134 ( iterPos > ptr[idx + 1] ||
135 ( !max_type && !iterPos && CREATE_HANDLE( entType, ID_FROM_HANDLE( iterPos ) ) > ptr[idx + 1] ) ) )
136 idx += 2;
137 if( (int)idx == count || TYPE_FROM_HANDLE( ptr[idx] ) > entType )
138 {
139 atend = true;
140 return MB_SUCCESS;
141 }
142 if( !iterPos && max_type )
143 iterPos = ptr[idx];
144 else if( !iterPos && TYPE_FROM_HANDLE( ptr[idx] ) <= entType && TYPE_FROM_HANDLE( ptr[idx + 1] ) >= entType )
145 {
146 iterPos = std::max( CREATE_HANDLE( entType, 1 ), ptr[idx] );
147 }
148
149 // idx points to start of subrange, iterPos in that subrange
150 do
151 {
152 EntityHandle next = ptr[idx + 1];
153 if( TYPE_FROM_HANDLE( next ) != entType && !max_type ) next = LAST_HANDLE( entType );
154 unsigned int this_ret = chunkSize - num_ret;
155 unsigned int to_end = next - iterPos + 1;
156 if( to_end < this_ret ) this_ret = to_end;
157 std::copy( MeshSet::hdl_iter( iterPos ), MeshSet::hdl_iter( iterPos + this_ret ), std::back_inserter( arr ) );
158 if( this_ret == to_end )
159 {
160 idx += 2;
161 iterPos = ( (int)idx < count ? ptr[idx] : 0 );
162 }
163 else
164 iterPos += this_ret;
165
166 num_ret += this_ret;
167 } while( (int)idx < count && num_ret < chunkSize && iterPos &&
168 ( max_type || TYPE_FROM_HANDLE( iterPos ) == entType ) );
169
170 if( !iterPos || ( !max_type && TYPE_FROM_HANDLE( iterPos ) != entType ) ) atend = true;
171
172 return MB_SUCCESS;
173 }
References moab::SetIterator::chunkSize, moab::CREATE_HANDLE(), moab::SetIterator::entType, moab::ID_FROM_HANDLE(), iterPos, moab::LAST_HANDLE(), MB_SUCCESS, MBMAXTYPE, and moab::TYPE_FROM_HANDLE().
Referenced by get_next_arr().
|
virtual |
reset the iterator to the beginning of the set
Implements moab::SetIterator.
Definition at line 229 of file SetIterator.cpp.
230 {
231 iterPos = 0;
232 return MB_SUCCESS;
233 }
References iterPos, and MB_SUCCESS.
|
friend |
Definition at line 98 of file SetIterator.hpp.
|
private |
Current iterator position, 0 if at beginning.
Definition at line 141 of file SetIterator.hpp.
Referenced by get_next_by_dimension(), get_next_by_type(), and reset().
|
private |
Number of range pairs.
Definition at line 147 of file SetIterator.hpp.
Referenced by build_pair_vec(), get_next_arr(), and ~RangeSetIterator().
|
private |
Special range pair ptr for root set.
Definition at line 144 of file SetIterator.hpp.
Referenced by build_pair_vec(), get_next_arr(), and ~RangeSetIterator().