/******************************************************************************* * CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps * * version 0.1 * * Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg * * * * This library is free software; you can redistribute it and/or modify it * * under the terms of the GNU Lesser General Public License as published by the * * Free Software Foundation; either version 2.1 of the License, or (at your * * option) any later version. * * * * This library is distributed in the hope that it will be useful, but WITHOUT * * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * * for more details. * * * * You should have received a copy of the GNU Lesser General Public License * * along with this library; if not, write to the Free Software Foundation, * * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * * * Web site: http://cgogn.unistra.fr/ * * Contact information: cgogn@unistra.fr * * * *******************************************************************************/ #include "Utils/static_assert.h" #include "Container/attributeMultiVector.h" #include "Container/fakeAttribute.h" namespace CGoGN { //********************** // Marker for traversor //********************** template MarkerForTraversor::MarkerForTraversor(MAP& map, bool forceDartMarker, unsigned int thread) : m_map(map), m_dmark(NULL), m_cmark(NULL) { if(!forceDartMarker && map.isOrbitEmbedded(ORBIT)) m_cmark = new CellMarkerStore(map, thread) ; else m_dmark = new DartMarkerStore(map, thread) ; } template MarkerForTraversor::~MarkerForTraversor() { if (m_cmark) delete m_cmark; if (m_dmark) delete m_dmark; } template void MarkerForTraversor::mark(Dart d) { if (m_cmark) m_cmark->mark(d); else m_dmark->markOrbit(d); } template void MarkerForTraversor::unmark(Dart d) { if (m_cmark) m_cmark->unmark(d); else m_dmark->unmarkOrbit(d); } template bool MarkerForTraversor::isMarked(Dart d) { if (m_cmark) return m_cmark->isMarked(d); return m_dmark->isMarked(d); } template CellMarkerStore* MarkerForTraversor::cmark() { return m_cmark; } template DartMarkerStore* MarkerForTraversor::dmark() { return m_dmark; } //************************************** // Traversor cellX Y incident to cell X //************************************** template Traversor3XY::Traversor3XY(MAP& map, Dart dart, bool forceDartMarker, unsigned int thread) : m_map(map), m_dmark(NULL), m_cmark(NULL), m_tradoo(map, dart, thread), m_QLT(NULL), m_allocated(true), m_first(true) { AttributeMultiVector > >* quickTraversal = map.template getQuickIncidentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } else { if(!forceDartMarker && map.isOrbitEmbedded(ORBY)) m_cmark = new CellMarkerStore(map, thread) ; else m_dmark = new DartMarkerStore(map, thread) ; } } template Traversor3XY::Traversor3XY(MAP& map, Dart dart, MarkerForTraversor& tmo, bool /*forceDartMarker*/, unsigned int thread) : m_map(map), m_tradoo(map, dart, thread), m_QLT(NULL), m_allocated(false), m_first(true) { m_cmark = tmo.cmark(); m_dmark = tmo.dmark(); } template Traversor3XY::~Traversor3XY() { if (m_allocated) { if (m_cmark) delete m_cmark; if (m_dmark) delete m_dmark; } } template Dart Traversor3XY::begin() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } if (!m_first) { if (m_cmark) m_cmark->unmarkAll(); else m_dmark->unmarkAll(); } m_first = false; m_current = m_tradoo.begin() ; // for the case of beginning with a given MarkerForTraversor if (!m_allocated) { if (m_cmark) { while ((m_current != NIL) && m_cmark->isMarked(m_current)) m_current = m_tradoo.next(); } else { while ((m_current != NIL) && m_dmark->isMarked(m_current)) m_current = m_tradoo.next(); } } if ((ORBY == VOLUME) && (m_current != NIL)) { if(m_map.isBoundaryMarked3(m_current)) m_current = next(); } return m_current; } template Dart Traversor3XY::end() { return NIL ; } template Dart Traversor3XY::next() { if(m_QLT != NULL) { return *m_ItDarts++; } if(m_current != NIL) { if (m_cmark) { m_cmark->mark(m_current); m_current = m_tradoo.next(); if(ORBY == VOLUME) { if(m_map.isBoundaryMarked3(m_current)) m_cmark->mark(m_current); } while ((m_current != NIL) && m_cmark->isMarked(m_current)) m_current = m_tradoo.next(); } else { if (ORBX == VOLUME) { // if allocated we are in a local traversal of volume so we can mark only darts of volume if (m_allocated) m_dmark->markOrbit(m_current); else m_dmark->markOrbit(m_current); // here we need to mark all the darts } else m_dmark->markOrbit(m_current); m_current = m_tradoo.next(); if(ORBY == VOLUME) { if(m_map.isBoundaryMarked3(m_current)) { if (ORBX == VOLUME) { // if allocated we are in a local traversal of volume so we can mark only darts of volume if (m_allocated) m_dmark->markOrbit(m_current); else m_dmark->markOrbit(m_current); // here we need to mark all the darts } else m_dmark->markOrbit(m_current); } } while ((m_current != NIL) && m_dmark->isMarked(m_current)) m_current = m_tradoo.next(); } } return m_current ; } //********************************************* // Traversor cellX to cellX adjacent by cell Y //********************************************* template Traversor3XXaY::Traversor3XXaY(MAP& map, Dart dart, bool forceDartMarker, unsigned int thread): m_map(map),m_QLT(NULL) { AttributeMultiVector > >* quickTraversal = map.template getQuickAdjacentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } else { MarkerForTraversor mk(map, forceDartMarker, thread); mk.mark(dart); Traversor3XY traAdj(map, dart, forceDartMarker, thread); for (Dart d = traAdj.begin(); d != traAdj.end(); d = traAdj.next()) { Traversor3XY traInci(map, d, mk, forceDartMarker, thread); for (Dart e = traInci.begin(); e != traInci.end(); e = traInci.next()) m_vecDarts.push_back(e); } m_vecDarts.push_back(NIL); } } template Dart Traversor3XXaY::begin() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } m_iter = m_vecDarts.begin(); return *m_iter; } template Dart Traversor3XXaY::end() { return NIL; } template Dart Traversor3XXaY::next() { if(m_QLT != NULL) { return *m_ItDarts++; } if (*m_iter != NIL) m_iter++; return *m_iter ; } //template //Traversor3* Traversor3::createXY(MAP& map, Dart dart, unsigned int orbX, unsigned int orbY) //{ // int code = 0x10*(orbX-VERTEX) + orbY-VERTEX; // // switch(code) // { // case 0x01: // return new Traversor3XY(map,dart); // break; // case 0x02: // return new Traversor3XY(map,dart); // break; // case 0x03: // return new Traversor3XY(map,dart); // break; // // case 0x10: // return new Traversor3XY(map,dart); // break; // case 0x12: // return new Traversor3XY(map,dart); // break; // case 0x13: // return new Traversor3XY(map,dart); // break; // // case 0x20: // return new Traversor3XY(map,dart); // break; // case 0x21: // return new Traversor3XY(map,dart); // break; // case 0x23: // return new Traversor3XY(map,dart); // break; // // case 0x30: // return new Traversor3XY(map,dart); // break; // case 0x31: // return new Traversor3XY(map,dart); // break; // case 0x32: // return new Traversor3XY(map,dart); // break; // // default: // return NULL; // break; // } // return NULL; //} // // //template //Traversor3* Traversor3::createXXaY(MAP& map, Dart dart, unsigned int orbX, unsigned int orbY) //{ // int code = 0x10*(orbX-VERTEX) + orbY-VERTEX; // // switch(code) // { // case 0x01: // return new Traversor3XXaY(map,dart); // break; // case 0x02: // return new Traversor3XXaY(map,dart); // break; // case 0x03: // return new Traversor3XXaY(map,dart); // break; // // case 0x10: // return new Traversor3XXaY(map,dart); // break; // case 0x12: // return new Traversor3XXaY(map,dart); // break; // case 0x13: // return new Traversor3XXaY(map,dart); // break; // // case 0x20: // return new Traversor3XXaY(map,dart); // break; // case 0x21: // return new Traversor3XXaY(map,dart); // break; // case 0x23: // return new Traversor3XXaY(map,dart); // break; // // case 0x30: // return new Traversor3XXaY(map,dart); // break; // case 0x31: // return new Traversor3XXaY(map,dart); // break; // case 0x32: // return new Traversor3XXaY(map,dart); // break; // // default: // return NULL; // break; // } // return NULL; //} } // namespace CGoGN