-// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//! Return an iterator on all element assigned to a given shape.
// nbElemsToReturn is used to optimize by stopping the iteration as soon as
// all elements assigned to the shape encountered.
+ // sm1stElem is used to quickly find the first chunk holding elements of the shape;
+ // it must have smallest ID between elements on the shape
template< class ElemIterator >
- boost::shared_ptr< ElemIterator > GetShapeIterator( int shapeID, size_t nbElemsToReturn );
+ boost::shared_ptr< ElemIterator > GetShapeIterator( int shapeID,
+ size_t nbElemsToReturn,
+ const SMDS_MeshElement* sm1stElem );
//! Mark the element as non-used
void Free( const SMDS_MeshElement* );
{
bool isFound = false;
- if ( sizeof( attr_t ) == sizeof( int ) && theMinValue )
- if ( theValue < *theMinValue || theValue > *theMaxValue )
- return isFound;
+ // if ( sizeof( attr_t ) == sizeof( int ) && theMinValue )
+ // if ( theValue < *theMinValue || theValue > *theMaxValue )
+ // return isFound;
for ( set_iterator it = mySet.begin(); it < mySet.end(); ++it )
{
typedef boost::dynamic_bitset<> TBitSet;
//typedef float TParam;
typedef double TParam;
+//typedef std::unordered_set<int> TSubIDSet;
//------------------------------------------------------------------------------------
/*!
TBitSet myMarkedSet; // mark some elements
TUsedRangeSet myUsedRanges; // ranges of used/unused elements
TSubIDRangeSet mySubIDRanges; // ranges of elements on the same sub-shape
- int myMinSubID; // min sub-shape ID
- int myMaxSubID; // max sub-shape ID
+ //TSubIDSet* mySubIDSet; // set of sub-shape IDs
+ // int myMinSubID; // min sub-shape ID
+ // int myMaxSubID; // max sub-shape ID
std::vector<TParam> myPositions; // UV parameters on shape: 2*param_t per an element
public:
//! Return ranges of elements assigned to sub-shapes and min/max of sub-shape IDs
const TSubIDRangeSet& GetSubIDRangesMinMax( int& min, int& max ) const
- { min = myMinSubID; max = myMaxSubID; return mySubIDRanges; }
+ { /*min = myMinSubID; max = myMaxSubID;*/ return mySubIDRanges; }
//! Minimize allocated memory
void Compact();
get_rangeset_fun theGetRangeSetFun,
attr_type theAttrValue,
SMDS_MeshElement::Filter* theFilter,
- size_t theNbElemsToReturn = -1):
+ size_t theNbElemsToReturn = -1,
+ int theChunkIndex = 0):
myElement( 0 ),
myRangeIndex( 0 ),
myChunks( theChunks ),
- myChunkIndex( -1 ),
+ myChunkIndex( theChunkIndex-1 ),
myGetRangeSetFun( theGetRangeSetFun ),
myValue( theAttrValue ),
myFilter( theFilter ),
template< class ElemIterator >
boost::shared_ptr< ElemIterator >
-SMDS_ElementFactory::GetShapeIterator( int shapeID, size_t nbElemsToReturn )
+SMDS_ElementFactory::GetShapeIterator( int shapeID,
+ size_t nbElemsToReturn,
+ const SMDS_MeshElement* sm1stElem )
{
+ int iChunk = sm1stElem ? (( sm1stElem->GetID() - 1 ) / ChunkSize()) : 0;
typedef _ChunkIterator< ElemIterator, TSubIDRangeSet > TChuckIterator;
return boost::make_shared< TChuckIterator >( myChunks,
& SMDS_ElementChunk::GetSubIDRangesMinMax,
/*shapeID=*/shapeID,
new SMDS_MeshElement::NonNullFilter(),
- nbElemsToReturn );
+ nbElemsToReturn,
+ iChunk );
}
#endif