diff --git a/include/Topology/generic/genericmap.h b/include/Topology/generic/genericmap.h index a2e0abd24b1af31e4386048cc4de34e47314d888..7e6400f16689aee61c8e72327e10f9c9130f4c5b 100644 --- a/include/Topology/generic/genericmap.h +++ b/include/Topology/generic/genericmap.h @@ -239,7 +239,6 @@ private: * internal functions */ void deleteDartLine(unsigned int index) ; - void copyDartLine(unsigned int dest, unsigned int src) ; unsigned int newCopyOfDartLine(unsigned int index) ; public: diff --git a/include/Topology/generic/genericmap.hpp b/include/Topology/generic/genericmap.hpp index b7649728ba41b5471bad01eb6db2b9e36123a115..b3bf1de001fd0d21e312d28c4d2e314d3bb17f81 100644 --- a/include/Topology/generic/genericmap.hpp +++ b/include/Topology/generic/genericmap.hpp @@ -109,28 +109,17 @@ inline Dart GenericMap::newDart() inline void GenericMap::deleteDart(Dart d) { - // hypothese : lors d'une suppression de brin, les attributs du brin supprimé - // sont identiques à tous les niveaux > au niveau où a lieu la suppression if(m_isMultiRes) { - // if a dart is deleted on its insertion level + // a MRdart can only be deleted on its insertion level + assert(getDartLevel(d) == m_mrCurrentLevel || !"deleteDart : try to delete a dart on a level greater than its insertion level") ; + // all the darts pointed in greater levels are deleted // and then the MRdart is deleted - if((*m_mrLevels)[d.index] == m_mrCurrentLevel) - { - for(unsigned int i = m_mrCurrentLevel; i < m_mrDarts.size(); ++i) - deleteDartLine((*m_mrDarts[i])[d.index]) ; - m_mrattribs.removeLine(d.index) ; - m_mrNbDarts[m_mrCurrentLevel]-- ; - } - // if a dart is deleted after its insertion level - // the dart of previous level is copied in the greater levels - else - { - unsigned int dprev = (*m_mrDarts[m_mrCurrentLevel - 1])[d.index] ; - for(unsigned int i = m_mrCurrentLevel; i < m_mrDarts.size(); ++i) - copyDartLine((*m_mrDarts[i])[d.index], dprev) ; - } + for(unsigned int i = m_mrCurrentLevel; i < m_mrDarts.size(); ++i) + deleteDartLine((*m_mrDarts[i])[d.index]) ; + m_mrattribs.removeLine(d.index) ; + m_mrNbDarts[m_mrCurrentLevel]-- ; } else deleteDartLine(dartIndex(d)) ; @@ -160,49 +149,14 @@ inline void GenericMap::deleteDartLine(unsigned int index) } } -inline void GenericMap::copyDartLine(unsigned int dest, unsigned int src) -{ - for(unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit) - { - if (m_embeddings[orbit]) // for each embedded orbit - { - unsigned int emb = (*m_embeddings[orbit])[dest] ; // get the embedding of the destination dart - if(emb != EMBNULL) - { - if(m_attribs[orbit].unrefLine(emb)) // unref the pointed embedding line - { - for (unsigned int t = 0; t < m_nbThreads; ++t) // and clear its markers if it was - (*m_markTables[orbit][t])[emb].clear() ; // its last unref (and was thus freed) - } - } - } - } - - m_attribs[DART].copyLine(dest, src) ; - - for(unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit) - { - if (m_embeddings[orbit]) // for each embedded orbit - { - unsigned int emb = (*m_embeddings[orbit])[src] ; // add a ref to the pointed attributes - if(emb != EMBNULL) - m_attribs[orbit].refLine(emb) ; - } - } -} - inline unsigned int GenericMap::newCopyOfDartLine(unsigned int index) { - unsigned int newindex = m_attribs[DART].insertLine() ; - m_attribs[DART].copyLine(newindex, index) ; + unsigned int newindex = m_attribs[DART].insertLine() ; // create a new dart line + m_attribs[DART].copyLine(newindex, index) ; // copy the given dart line for(unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit) { - if (m_embeddings[orbit]) - { - unsigned int emb = (*m_embeddings[orbit])[newindex] ; // add a ref to the pointed attributes - if(emb != EMBNULL) - m_attribs[orbit].refLine(emb) ; - } + if (m_embeddings[orbit]) // put the embeddings of the + (*m_embeddings[orbit])[newindex] = EMBNULL ; // new line to EMBNULL } return newindex ; } diff --git a/include/Topology/map/map2MR/map2MR_Primal.h b/include/Topology/map/map2MR/map2MR_Primal.h index 4cdcfc2dba34fbb09394b3336efb1c0bd654db26..d6355bdb70381a9124f5cdbfd2e81d376dc4c8ef 100644 --- a/include/Topology/map/map2MR/map2MR_Primal.h +++ b/include/Topology/map/map2MR/map2MR_Primal.h @@ -35,6 +35,20 @@ class Map2MR_Primal : public EmbeddedMap2 public: Map2MR_Primal() ; + void copyVertexEmbeddings() + { + unsigned int maxL = getMaxLevel() ; + for(unsigned int i = m_mrattribs.begin(); i != m_mrattribs.end(); m_mrattribs.next(i)) + { + unsigned int previdx = (*m_mrDarts[maxL - 1])[i] ; + unsigned int newidx = (*m_mrDarts[maxL])[i] ; + unsigned int emb = (*m_embeddings[VERTEX])[previdx] ; + (*m_embeddings[VERTEX])[newidx] = emb ; + if(emb != EMBNULL) + m_attribs[VERTEX].refLine(emb); + } + } + /*************************************************** * CELLS INFORMATION * ***************************************************/ diff --git a/src/Topology/generic/genericmap.cpp b/src/Topology/generic/genericmap.cpp index 8f93f11108337206a3c0ce38ab3a0f28f7a18cb7..018e876d1afb0ccf14c26ac370abe297cd5c5899 100644 --- a/src/Topology/generic/genericmap.cpp +++ b/src/Topology/generic/genericmap.cpp @@ -190,21 +190,20 @@ void GenericMap::addLevel() unsigned int newLevel = m_mrDarts.size() ; std::stringstream ss ; ss << "MRdart_"<< newLevel ; - AttributeMultiVector* amvMR = m_mrattribs.addAttribute(ss.str()) ; + AttributeMultiVector* newAttrib = m_mrattribs.addAttribute(ss.str()) ; - m_mrDarts.push_back(amvMR) ; + m_mrDarts.push_back(newAttrib) ; m_mrNbDarts.push_back(0) ; if(m_mrDarts.size() > 1) { - // copy the darts indices of the previous level - m_mrattribs.copyAttribute(amvMR->getIndex(), m_mrDarts[newLevel - 1]->getIndex()) ; + AttributeMultiVector* prevAttrib = m_mrDarts[newLevel - 1] ; // duplicate all the darts in the new level for(unsigned int i = m_mrattribs.begin(); i != m_mrattribs.end(); m_mrattribs.next(i)) { - unsigned int oldi = (*amvMR)[i] ; // get the index of the dart in previous level - (*amvMR)[i] = newCopyOfDartLine(oldi) ; // copy the dart and affect it to the new level + unsigned int oldi = (*prevAttrib)[i] ; // get the index of the dart in previous level + (*newAttrib)[i] = newCopyOfDartLine(oldi) ; // copy the dart and affect it to the new level } } } diff --git a/src/Topology/map/map2MR/map2MR_Primal.cpp b/src/Topology/map/map2MR/map2MR_Primal.cpp index c1271ce75969858920e9e470f126853b39cd25b1..5a9267829df9dc17329afcc598eb1a2583fbdd54 100644 --- a/src/Topology/map/map2MR/map2MR_Primal.cpp +++ b/src/Topology/map/map2MR/map2MR_Primal.cpp @@ -262,7 +262,10 @@ void Map2MR_Primal::subdivideEdge(Dart d) pushLevel() ; if(eLevel == getMaxLevel()) + { addLevel() ; + copyVertexEmbeddings() ; + } setCurrentLevel(eLevel + 1) ; cutEdge(d) ;