From b4e161eda4648c37c56edc3966af5904ab34a1ca Mon Sep 17 00:00:00 2001 From: Amaury Johnan <amjohnen@gmail.com> Date: Wed, 4 Apr 2012 14:13:45 +0000 Subject: [PATCH] replace set with vector for rec mesh entities --- Mesh/meshGFaceRecombine.cpp | 122 ++++++++++++++++++++---------------- Mesh/meshGFaceRecombine.h | 54 ++++++++-------- 2 files changed, 95 insertions(+), 81 deletions(-) diff --git a/Mesh/meshGFaceRecombine.cpp b/Mesh/meshGFaceRecombine.cpp index 9463c3a32d..3bb4d0d173 100644 --- a/Mesh/meshGFaceRecombine.cpp +++ b/Mesh/meshGFaceRecombine.cpp @@ -578,68 +578,80 @@ Rec2DData::~Rec2DData() Rec2DData::_current = NULL; } -#ifdef REC2D_DRAW -void Rec2DData::add(Rec2DElement *rel) +void Rec2DData::add(const Rec2DEdge *re) +{ + if (re->_pos > -1) { + Msg::Error("[Rec2DData] edge already there"); + return; + } + ((Rec2DEdge*)re)->_pos = _current->_edges.size(); + _current->_edges.push_back((Rec2DEdge*)re); +} + +void Rec2DData::add(const Rec2DVertex *rv) +{ + if (rv->_pos > -1) { + Msg::Error("[Rec2DData] vert %d already there (size %d)", rv, _current->_vertices.size()); + return; + } + ((Rec2DVertex*)rv)->_pos = _current->_vertices.size(); + _current->_vertices.push_back((Rec2DVertex*)rv); +} + +void Rec2DData::add(const Rec2DElement *rel) { - _current->_elements.insert(rel); + if (rel->_pos > -1) { + Msg::Error("[Rec2DData] elem already there"); + return; + } + ((Rec2DElement*)rel)->_pos = _current->_elements.size(); + _current->_elements.push_back((Rec2DElement*)rel); +#ifdef REC2D_DRAW MTriangle *t = rel->getMTriangle(); if (t) _current->_tri.push_back(t); MQuadrangle *q = rel->getMQuadrangle(); if (q) _current->_quad.push_back(q); - -} #endif -void Rec2DData::remove(const Rec2DEdge *re) +} + +void Rec2DData::rmv(const Rec2DEdge *re) { - /*bool b = false; - unsigned int i = 0; - while (i < _current->_edges.size()) { - if (_current->_edges[i] == re) { - _current->_edges[i] = _current->_edges.back(); - _current->_edges.pop_back(); - if (b) - Msg::Error("[Rec2DData] Two or more times same edge"); - b = true; - } - else - ++i; + if (re->_pos < 0) { + Msg::Error("[Rec2DData] edge not there"); + return; } - if (!b) - Msg::Error("[Rec2DData] No edge"); - */ - _current->_edges.erase((Rec2DEdge*)re); + _current->_edges.back()->_pos = re->_pos; + _current->_edges[re->_pos] = _current->_edges.back(); + _current->_edges.pop_back(); + ((Rec2DEdge*)re)->_pos = -1; } -void Rec2DData::remove(const Rec2DVertex *rv) +void Rec2DData::rmv(const Rec2DVertex *rv) { - _current->_vertices.erase((Rec2DVertex*)rv); - static int a = -1; - if (++a < 1) - Msg::Warning("FIXME Verifier element supprimŽ"); + if (rv->_pos < 0) { + Msg::Error("[Rec2DData] vert not there"); + return; + } + _current->_vertices.back()->_pos = rv->_pos; + _current->_vertices[rv->_pos] = _current->_vertices.back(); + _current->_vertices.pop_back(); + ((Rec2DVertex*)rv)->_pos = -1; } -void Rec2DData::remove(/*const*/ Rec2DElement *rel) +void Rec2DData::rmv(const Rec2DElement *rel) { - /*bool b = false; - unsigned int i = 0; - while (i < _current->_elements.size()) { - if (_current->_elements[i] == rel) { - _current->_elements[i] = _current->_elements.back(); - _current->_elements.pop_back(); - if (b) - Msg::Error("[Rec2DData] Two or more times same element"); - b = true; - } - else - ++i; + if (rel->_pos < 0) { + Msg::Error("[Rec2DData] vert not there"); + return; } - if (!b) - Msg::Error("[Rec2DData] No element"); - */ - _current->_elements.erase(rel); + _current->_elements.back()->_pos = rel->_pos; + _current->_elements[rel->_pos] = _current->_elements.back(); + _current->_elements.pop_back(); + ((Rec2DElement*)rel)->_pos = -1; + #ifdef REC2D_DRAW MTriangle *t = rel->getMTriangle(); if (t) { @@ -666,7 +678,7 @@ void Rec2DData::remove(/*const*/ Rec2DElement *rel) #endif } -void Rec2DData::remove(const Rec2DAction *ra) +void Rec2DData::rmv(const Rec2DAction *ra) { std::list<Rec2DAction*>::iterator it = _current->_actions.begin(); while (it != _current->_actions.end()) { @@ -1597,7 +1609,7 @@ void Rec2DTwoTri2Quad::hide() _triangles[0]->remove(this); if (_triangles[1]) _triangles[1]->remove(this); - Rec2DData::remove(this); + Rec2DData::rmv(this); } void Rec2DTwoTri2Quad::reveal() @@ -1989,7 +2001,7 @@ void Rec2DCollapse::hide() _rec->_triangles[0]->remove(this); if (_rec->_triangles[1]) _rec->_triangles[1]->remove(this); - Rec2DData::remove(this); + Rec2DData::rmv(this); } void Rec2DCollapse::reveal() @@ -2308,7 +2320,7 @@ bool Rec2DCollapse::whatWouldYouDo /*****************/ Rec2DEdge::Rec2DEdge(Rec2DVertex *rv0, Rec2DVertex *rv1) : _rv0(rv0), _rv1(rv1), _lastUpdate(-1), - _weight(REC2D_EDGE_BASE+2*REC2D_EDGE_QUAD) + _weight(REC2D_EDGE_BASE+2*REC2D_EDGE_QUAD), _pos(-1) { _computeQual(); reveal(); @@ -2318,7 +2330,7 @@ void Rec2DEdge::hide() { _rv0->rmv(this); _rv1->rmv(this); - Rec2DData::remove(this); + Rec2DData::rmv(this); Rec2DData::addEdge(-_weight, -getWeightedQual()); } @@ -2538,7 +2550,7 @@ void Rec2DEdge::getActions(std::vector<Rec2DAction*> &actions) const /*******************/ Rec2DVertex::Rec2DVertex(MVertex *v) : _v(v), _angle(4.*M_PI), _onWhat(1), _parity(0), - _lastUpdate(-1), _sumQualAngle(.0) + _lastUpdate(-1), _sumQualAngle(.0), _pos(-1) { reparamMeshVertexOnFace(_v, Recombine2D::getGFace(), _param); Rec2DData::add(this); @@ -2553,7 +2565,7 @@ Rec2DVertex::Rec2DVertex(Rec2DVertex *rv, double ang) : _v(rv->_v), _angle(ang), _onWhat(-1), _parity(rv->_parity), _lastUpdate(rv->_lastUpdate), _sumQualAngle(rv->_sumQualAngle), _edges(rv->_edges), - _elements(rv->_elements), _param(rv->_param) + _elements(rv->_elements), _param(rv->_param), _pos(-1) { static int a = -1; if (++a < -1) Msg::Warning("FIXME Edges really necessary ?"); @@ -2580,7 +2592,7 @@ void Rec2DVertex::hide() if (_parity) Rec2DData::removeParity(this, _parity); - Rec2DData::remove(this); + Rec2DData::rmv(this); if (_elements.size()) { Msg::Error("[Rec2DVertex] normal ?"); Rec2DData::addVert(-REC2D_NUMB_VERT, -getQual()); @@ -3010,7 +3022,7 @@ void Rec2DVertex::getUniqueActions(std::vector<Rec2DAction*> &actions) const /** Rec2DElement **/ /********************/ Rec2DElement::Rec2DElement(MTriangle *t, const Rec2DEdge **re, Rec2DVertex **rv) -: _mEl((MElement *)t), _numEdge(3) +: _mEl((MElement *)t), _numEdge(3), _pos(-1) { for (int i = 0; i < 3; ++i) _edges[i] = (Rec2DEdge*)re[i]; @@ -3024,7 +3036,7 @@ Rec2DElement::Rec2DElement(MTriangle *t, const Rec2DEdge **re, Rec2DVertex **rv) } Rec2DElement::Rec2DElement(MQuadrangle *q, const Rec2DEdge **re, Rec2DVertex **rv) -: _mEl((MElement *)q), _numEdge(4) +: _mEl((MElement *)q), _numEdge(4), _pos(-1) { for (int i = 0; i < 4; ++i) _edges[i] = (Rec2DEdge*)re[i]; @@ -3050,7 +3062,7 @@ void Rec2DElement::hide() for (int i = 0; i < _numEdge; ++i) { vertices[i]->rmv(this); } - Rec2DData::remove(this); + Rec2DData::rmv(this); } void Rec2DElement::reveal(Rec2DVertex **rv) diff --git a/Mesh/meshGFaceRecombine.h b/Mesh/meshGFaceRecombine.h index ee972e468c..c3646aa448 100644 --- a/Mesh/meshGFaceRecombine.h +++ b/Mesh/meshGFaceRecombine.h @@ -95,9 +95,9 @@ class Rec2DData { static Rec2DData *_current; int _remainingTri; - std::set<Rec2DEdge*> _edges; - std::set<Rec2DVertex*> _vertices; - std::set<Rec2DElement*> _elements; + std::vector<Rec2DEdge*> _edges; + std::vector<Rec2DVertex*> _vertices; + std::vector<Rec2DElement*> _elements; std::list<Rec2DAction*> _actions; std::vector<Rec2DAction*> _hiddenActions; @@ -162,9 +162,9 @@ class Rec2DData { static inline bool hasAction() {return !_current->_actions.empty();} static void checkObsolete(); - typedef std::set<Rec2DEdge*>::iterator iter_re; - typedef std::set<Rec2DVertex*>::iterator iter_rv; - typedef std::set<Rec2DElement*>::iterator iter_rel; + typedef std::vector<Rec2DEdge*>::iterator iter_re; + typedef std::vector<Rec2DVertex*>::iterator iter_rv; + typedef std::vector<Rec2DElement*>::iterator iter_rel; static inline iter_re firstEdge() {return _current->_edges.begin();} static inline iter_rv firstVertex() {return _current->_vertices.begin();} static inline iter_rel firstElement() {return _current->_elements.begin();} @@ -172,29 +172,19 @@ class Rec2DData { static inline iter_rv lastVertex() {return _current->_vertices.end();} static inline iter_rel lastElement() {return _current->_elements.end();} - static inline void add(const Rec2DEdge *re) { - _current->_edges.insert((Rec2DEdge*)re); - } - static inline void add(const Rec2DVertex *rv) { - _current->_vertices.insert((Rec2DVertex*)rv); - } -#ifndef REC2D_DRAW - static inline void add(const Rec2DElement *rel) { - _current->_elements.insert((Rec2DElement*)rel); - } -#else - static void add(Rec2DElement *rel); -#endif + static void add(const Rec2DEdge*); + static void add(const Rec2DVertex*); + static void add(const Rec2DElement*); static inline void add(const Rec2DAction *ra) { _current->_actions.push_back((Rec2DAction*)ra); } static inline void addHidden(const Rec2DAction *ra) { _current->_hiddenActions.push_back((Rec2DAction*)ra); } - static void remove(const Rec2DEdge*); - static void remove(const Rec2DVertex*); - static void remove(/*const*/ Rec2DElement*); - static void remove(const Rec2DAction*); + static void rmv(const Rec2DEdge*); + static void rmv(const Rec2DVertex*); + static void rmv(const Rec2DElement*); + static void rmv(const Rec2DAction*); static inline void addEndNode(const Rec2DNode *rn) { _current->_endNodes.push_back((Rec2DNode*)rn); @@ -444,6 +434,10 @@ class Rec2DEdge { double _qual; int _lastUpdate, _weight; + int _pos; + friend void Rec2DData::add(const Rec2DEdge*); + friend void Rec2DData::rmv(const Rec2DEdge*); + public : Rec2DEdge(Rec2DVertex*, Rec2DVertex*); ~Rec2DEdge() {hide();} @@ -498,6 +492,10 @@ class Rec2DVertex { std::vector<Rec2DElement*> _elements; SPoint2 _param; + int _pos; + friend void Rec2DData::add(const Rec2DVertex*); + friend void Rec2DData::rmv(const Rec2DVertex*); + static double **_qualVSnum; static double **_gains; @@ -581,6 +579,10 @@ class Rec2DElement { Rec2DElement *_elements[4]; // NULL if no neighbour std::vector<Rec2DAction*> _actions; + int _pos; + friend void Rec2DData::add(const Rec2DElement*); + friend void Rec2DData::rmv(const Rec2DElement*); + public : Rec2DElement(MTriangle*, const Rec2DEdge**, Rec2DVertex **rv = NULL); Rec2DElement(MQuadrangle*, const Rec2DEdge**, Rec2DVertex **rv = NULL); @@ -607,7 +609,7 @@ class Rec2DElement { inline MElement* getMElement() const {return _mEl;} #ifdef REC2D_DRAW - MTriangle* getMTriangle() { + MTriangle* getMTriangle() const { if (_numEdge == 3) { if (_mEl) return (MTriangle*) _mEl; @@ -616,10 +618,10 @@ class Rec2DElement { } return NULL; } - MQuadrangle* getMQuadrangle() { + MQuadrangle* getMQuadrangle() const { if (_numEdge == 4) { if (!_mEl) - _mEl = (MElement*) _createQuad(); + ((Rec2DElement*)this)->_mEl = (MElement*) _createQuad(); return (MQuadrangle*) _mEl; } return NULL; -- GitLab