// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#ifdef _MSC_VER
+#pragma warning(disable:4786)
+#endif
#include "SMDS_MeshNode.hxx"
#include "SMDS_SpacePosition.hxx"
#include "SMDS_IteratorOfElements.hxx"
+using namespace std;
+
//=======================================================================
//function : SMDS_MeshNode
//purpose :
void SMDS_MeshNode::RemoveInverseElement(const SMDS_MeshElement * parent)
{
- myInverseElements.erase(parent);
+ NCollection_List<const SMDS_MeshElement*>::Iterator it(myInverseElements);
+ while (it.More()) {
+ const SMDS_MeshElement* elem = it.Value();
+ if (elem == parent)
+ myInverseElements.Remove(it);
+ else
+ it.Next();
+ }
}
//=======================================================================
return myPosition;
}
+//=======================================================================
+/*!
+ * \brief Iterator on list of elements
+ */
+//=======================================================================
+
class SMDS_MeshNode_MyInvIterator:public SMDS_ElemIterator
{
- const set<const SMDS_MeshElement*>& mySet;
- set<const SMDS_MeshElement*>::iterator myIterator;
+ NCollection_List<const SMDS_MeshElement*>::Iterator myIterator;
+ SMDSAbs_ElementType myType;
public:
- SMDS_MeshNode_MyInvIterator(const set<const SMDS_MeshElement*>& s):
- mySet(s)
- {
- myIterator=mySet.begin();
- }
+ SMDS_MeshNode_MyInvIterator(const NCollection_List<const SMDS_MeshElement*>& s,
+ SMDSAbs_ElementType type):
+ myIterator(s), myType(type)
+ {}
bool more()
{
- return myIterator!=mySet.end();
+ if ( myType != SMDSAbs_All ) {
+ while ( myIterator.More() && myIterator.Value()->GetType() != myType)
+ myIterator.Next();
+ }
+ return myIterator.More() != Standard_False;
}
const SMDS_MeshElement* next()
{
- const SMDS_MeshElement* current=*myIterator;
- myIterator++;
- return current;
+ const SMDS_MeshElement* current=myIterator.Value();
+ myIterator.Next();
+ return current;
}
};
SMDS_ElemIteratorPtr SMDS_MeshNode::
- GetInverseElementIterator() const
+ GetInverseElementIterator(SMDSAbs_ElementType type) const
{
- return SMDS_ElemIteratorPtr(new SMDS_MeshNode_MyInvIterator(myInverseElements));
+ return SMDS_ElemIteratorPtr(new SMDS_MeshNode_MyInvIterator(myInverseElements,type));
}
// Same as GetInverseElementIterator but the create iterator only return
// wanted type elements.
class SMDS_MeshNode_MyIterator:public SMDS_ElemIterator
{
- set<const SMDS_MeshElement*> mySet;
- set<const SMDS_MeshElement*>::iterator myIterator;
+ NCollection_List<const SMDS_MeshElement*> mySet;
+ NCollection_List<const SMDS_MeshElement*>::Iterator myIterator;
public:
SMDS_MeshNode_MyIterator(SMDSAbs_ElementType type,
- const set<const SMDS_MeshElement*>& s)
+ const NCollection_List<const SMDS_MeshElement*>& s)
{
const SMDS_MeshElement * e;
bool toInsert;
- set<const SMDS_MeshElement*>::iterator it=s.begin();
- while(it!=s.end())
+ NCollection_List<const SMDS_MeshElement*>::Iterator it(s);
+ for(; it.More(); it.Next())
{
- e=*it;
+ e=it.Value();
switch(type)
{
case SMDSAbs_Edge: toInsert=true; break;
case SMDSAbs_Face: toInsert=(e->GetType()!=SMDSAbs_Edge); break;
case SMDSAbs_Volume: toInsert=(e->GetType()==SMDSAbs_Volume); break;
}
- if(toInsert) mySet.insert(e);
- it++;
+ if(toInsert) mySet.Append(e);
}
- myIterator=mySet.begin();
+ myIterator.Init(mySet);
}
bool more()
{
- return myIterator!=mySet.end();
+ return myIterator.More() != Standard_False;
}
const SMDS_MeshElement* next()
{
- const SMDS_MeshElement* current=*myIterator;
- myIterator++;
+ const SMDS_MeshElement* current=myIterator.Value();
+ myIterator.Next();
return current;
}
};
//=======================================================================
void SMDS_MeshNode::AddInverseElement(const SMDS_MeshElement* ME)
{
- myInverseElements.insert(ME);
+ NCollection_List<const SMDS_MeshElement*>::Iterator it(myInverseElements);
+ for (; it.More(); it.Next()) {
+ const SMDS_MeshElement* elem = it.Value();
+ if (elem == ME)
+ return;
+ }
+ myInverseElements.Append(ME);
}
//=======================================================================
//=======================================================================
void SMDS_MeshNode::ClearInverseElements()
{
- myInverseElements.clear();
+ myInverseElements.Clear();
}
bool SMDS_MeshNode::emptyInverseElements()
{
- return myInverseElements.empty();
+ return myInverseElements.IsEmpty() != Standard_False;
+}
+
+//================================================================================
+/*!
+ * \brief Count inverse elements of given type
+ */
+//================================================================================
+
+int SMDS_MeshNode::NbInverseElements(SMDSAbs_ElementType type) const
+{
+ if ( type == SMDSAbs_All )
+ return myInverseElements.Extent();
+ int nb = 0;
+ NCollection_List<const SMDS_MeshElement*>::Iterator it( myInverseElements );
+ for ( ; it.More(); it.Next() )
+ if ( it.Value()->GetType() == type )
+ nb++;
+ return nb;
}
///////////////////////////////////////////////////////////////////////////////