![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <SetIterator.hpp>
Public Member Functions | |
virtual | ~RangeSetIterator () |
Destructor. | |
virtual ErrorCode | get_next_arr (std::vector< EntityHandle > &arr, bool &atend) |
get the next chunkSize entities Return the next chunkSize entities. | |
virtual ErrorCode | reset () |
reset the iterator to the beginning of the set | |
Protected Member Functions | |
RangeSetIterator (Core *core, EntityHandle ent_set, int chunk_size, EntityType ent_type, int ent_dimension, bool check_valid=false) | |
Constructor. | |
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. | |
Private Attributes | |
EntityHandle | iterPos |
Current iterator position, 0 if at beginning. | |
EntityHandle * | pairPtr |
Special range pair ptr for root set. | |
int | numPairs |
Number of range pairs. | |
Friends | |
class | Core |
Definition at line 95 of file SetIterator.hpp.
moab::RangeSetIterator::~RangeSetIterator | ( | ) | [virtual] |
Destructor.
Definition at line 40 of file SetIterator.cpp.
References numPairs, and pairPtr.
{
if( pairPtr ) delete[] pairPtr;
numPairs = 0;
}
moab::RangeSetIterator::RangeSetIterator | ( | Core * | core, |
EntityHandle | ent_set, | ||
int | chunk_size, | ||
EntityType | ent_type, | ||
int | ent_dimension, | ||
bool | check_valid = false |
||
) | [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.
References build_pair_vec(), ErrorCode, and MB_SUCCESS.
: SetIterator( core, eset, chunk_sz, ent_tp, ent_dim, check_valid ), iterPos( 0 ), pairPtr( NULL ), numPairs( 0 )
{
if( !eset )
{
// special case for the root set, have to keep a local array
ErrorCode rval = build_pair_vec();
assert( MB_SUCCESS == rval );
// empty statement to avoid warning
(void)( rval );
}
}
ErrorCode moab::RangeSetIterator::build_pair_vec | ( | ) | [private] |
Build the special pair vector for the root set.
Definition at line 46 of file SetIterator.cpp.
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().
{
// shouldn't be here unless we're iterating the root set
assert( !entSet );
Range all_ents;
ErrorCode rval = myCore->get_entities_by_handle( 0, all_ents );
if( MB_SUCCESS != rval ) return rval;
if( pairPtr ) delete[] pairPtr;
pairPtr = new EntityHandle[2 * all_ents.psize()];
Range::const_pair_iterator pi;
int i;
for( pi = all_ents.const_pair_begin(), i = 0; pi != all_ents.const_pair_end(); ++pi, i += 2 )
{
pairPtr[i] = ( *pi ).first;
pairPtr[i + 1] = ( *pi ).second;
}
numPairs = all_ents.psize();
return MB_SUCCESS;
}
ErrorCode moab::RangeSetIterator::get_next_arr | ( | std::vector< EntityHandle > & | arr, |
bool & | atend | ||
) | [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.
References build_pair_vec(), moab::SetIterator::checkValid, moab::WriteUtilIface::CONTENTS, moab::SetIterator::entDimension, moab::SetIterator::entSet, ErrorCode, moab::WriteUtilIface::get_entity_list_pointers(), 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().
{
atend = false;
int count;
const EntityHandle* ptr;
WriteUtilIface* iface;
std::vector< EntityHandle > tmp_arr;
std::vector< EntityHandle >* tmp_ptr = &arr;
if( checkValid ) tmp_ptr = &tmp_arr;
ErrorCode rval;
if( !pairPtr )
{
Interface* mbImpl = dynamic_cast< Interface* >( myCore );
rval = mbImpl->query_interface( iface );
if( MB_SUCCESS != rval ) return rval;
rval = iface->get_entity_list_pointers( &entSet, 1, &ptr, WriteUtilIface::CONTENTS, &count );
if( MB_SUCCESS != rval ) return rval;
mbImpl->release_interface( iface );
}
else
{
if( checkValid )
{
rval = build_pair_vec();
if( MB_SUCCESS != rval ) return rval;
}
ptr = pairPtr;
count = 2 * numPairs;
}
assert( !( count % 2 ) );
if( !count )
{
atend = true;
return MB_SUCCESS;
}
if( -1 == entDimension )
rval = get_next_by_type( ptr, count, *tmp_ptr, atend );
else
rval = get_next_by_dimension( ptr, count, *tmp_ptr, atend );
if( MB_SUCCESS != rval ) return rval;
if( checkValid )
{
for( std::vector< EntityHandle >::iterator vit = tmp_ptr->begin(); vit != tmp_ptr->end(); ++vit )
{
if( myCore->is_valid( *vit ) ) arr.push_back( *vit );
}
}
return MB_SUCCESS;
}
ErrorCode moab::RangeSetIterator::get_next_by_dimension | ( | const EntityHandle *& | ptr, |
int | count, | ||
std::vector< EntityHandle > & | arr, | ||
bool & | atend | ||
) | [private] |
Definition at line 175 of file SetIterator.cpp.
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().
{
// iterating by dimension - type should be maxtype
if( entType != MBMAXTYPE )
{
MB_SET_ERR( MB_FAILURE, "Both dimension and type should not be set on an iterator" );
}
unsigned int num_ret = 0;
size_t idx = 0;
// initialize to first relevant handle
while( (int)idx < count && ( iterPos > ptr[idx + 1] ||
( !iterPos && entDimension > CN::Dimension( TYPE_FROM_HANDLE( ptr[idx + 1] ) ) ) ) )
idx += 2;
if( (int)idx == count || CN::Dimension( TYPE_FROM_HANDLE( ptr[idx] ) ) > entDimension )
{
atend = true;
return MB_SUCCESS;
}
if( !iterPos )
iterPos = ptr[idx];
else if( CN::Dimension( TYPE_FROM_HANDLE( ptr[idx] ) ) < entDimension )
iterPos = CREATE_HANDLE( CN::TypeDimensionMap[entDimension].first, 1 );
// idx points to start of subrange, iterPos in that subrange
do
{
EntityHandle next = ptr[idx + 1];
if( CN::Dimension( TYPE_FROM_HANDLE( next ) ) != entDimension )
next = LAST_HANDLE( CN::TypeDimensionMap[entDimension].second );
unsigned int this_ret = chunkSize - num_ret;
unsigned int to_end = next - iterPos + 1;
if( to_end < this_ret ) this_ret = to_end;
std::copy( MeshSet::hdl_iter( iterPos ), MeshSet::hdl_iter( iterPos + this_ret ), std::back_inserter( arr ) );
if( this_ret == to_end )
{
idx += 2;
iterPos = ( (int)idx < count ? ptr[idx] : 0 );
}
else
iterPos += this_ret;
num_ret += this_ret;
} while( (int)idx < count && num_ret < chunkSize && iterPos &&
CN::Dimension( TYPE_FROM_HANDLE( iterPos ) ) == entDimension );
if( !iterPos || CN::Dimension( TYPE_FROM_HANDLE( iterPos ) ) != entDimension ) atend = true;
return MB_SUCCESS;
}
ErrorCode moab::RangeSetIterator::get_next_by_type | ( | const EntityHandle *& | ptr, |
int | count, | ||
std::vector< EntityHandle > & | arr, | ||
bool & | atend | ||
) | [private] |
Definition at line 124 of file SetIterator.cpp.
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().
{
unsigned int num_ret = 0;
bool max_type = ( entType == MBMAXTYPE );
size_t idx = 0;
// initialize to first relevant handle
while( (int)idx < count &&
( iterPos > ptr[idx + 1] ||
( !max_type && !iterPos && CREATE_HANDLE( entType, ID_FROM_HANDLE( iterPos ) ) > ptr[idx + 1] ) ) )
idx += 2;
if( (int)idx == count || TYPE_FROM_HANDLE( ptr[idx] ) > entType )
{
atend = true;
return MB_SUCCESS;
}
if( !iterPos && max_type )
iterPos = ptr[idx];
else if( !iterPos && TYPE_FROM_HANDLE( ptr[idx] ) <= entType && TYPE_FROM_HANDLE( ptr[idx + 1] ) >= entType )
{
iterPos = std::max( CREATE_HANDLE( entType, 1 ), ptr[idx] );
}
// idx points to start of subrange, iterPos in that subrange
do
{
EntityHandle next = ptr[idx + 1];
if( TYPE_FROM_HANDLE( next ) != entType && !max_type ) next = LAST_HANDLE( entType );
unsigned int this_ret = chunkSize - num_ret;
unsigned int to_end = next - iterPos + 1;
if( to_end < this_ret ) this_ret = to_end;
std::copy( MeshSet::hdl_iter( iterPos ), MeshSet::hdl_iter( iterPos + this_ret ), std::back_inserter( arr ) );
if( this_ret == to_end )
{
idx += 2;
iterPos = ( (int)idx < count ? ptr[idx] : 0 );
}
else
iterPos += this_ret;
num_ret += this_ret;
} while( (int)idx < count && num_ret < chunkSize && iterPos &&
( max_type || TYPE_FROM_HANDLE( iterPos ) == entType ) );
if( !iterPos || ( !max_type && TYPE_FROM_HANDLE( iterPos ) != entType ) ) atend = true;
return MB_SUCCESS;
}
ErrorCode moab::RangeSetIterator::reset | ( | ) | [virtual] |
reset the iterator to the beginning of the set
Implements moab::SetIterator.
Definition at line 229 of file SetIterator.cpp.
References iterPos, and MB_SUCCESS.
{
iterPos = 0;
return MB_SUCCESS;
}
friend class Core [friend] |
Reimplemented from moab::SetIterator.
Definition at line 98 of file SetIterator.hpp.
EntityHandle moab::RangeSetIterator::iterPos [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().
int moab::RangeSetIterator::numPairs [private] |
Number of range pairs.
Definition at line 147 of file SetIterator.hpp.
Referenced by build_pair_vec(), get_next_arr(), and ~RangeSetIterator().
EntityHandle* moab::RangeSetIterator::pairPtr [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().