diff --git a/include/Topology/generic/genericmap.h b/include/Topology/generic/genericmap.h index 294fe2d8269d7af128aafcbe8bc201312a7521ae..4ff1e0efd7128a9a37328b3948fce004aca28c13 100644 --- a/include/Topology/generic/genericmap.h +++ b/include/Topology/generic/genericmap.h @@ -35,7 +35,6 @@ #include #include - #include "Container/attributeContainer.h" #include "Topology/generic/dart.h" @@ -89,7 +88,7 @@ protected: /** * Direct access to the Dart attributes that store the orbits embeddings - * (only initialized when necessary) + * (only initialized when necessary, i.e. addEmbedding function) */ AttributeMultiVector* m_embeddings[NB_ORBITS] ; @@ -114,14 +113,12 @@ protected: /** * Store links to created AttributeHandlers, DartMarkers and CellMarkers */ - std::multimap attributeHandlers ; // TODO think of MT (AttributeHandler creation & release are not thread safe! + std::multimap attributeHandlers ; // TODO think of MT (AttributeHandler creation & release are not thread safe!) boost::mutex attributeHandlersMutex; std::vector dartMarkers[NB_THREAD] ; std::vector cellMarkers[NB_THREAD] ; - - /** * is map a multiresolution map */ @@ -170,6 +167,8 @@ public: virtual std::string mapTypeName() const = 0 ; + virtual unsigned int dimension() const = 0 ; + /** * Clear the map * @param removeAttrib @@ -236,7 +235,6 @@ public: // */ // AttributeMultiVector* addLevel(); -public: /** * add a resolution level in the back of the level table (use only in MRMaps) */ @@ -314,7 +312,6 @@ public: */ void incDartLevel(Dart d) const ; - /** * get the number of darts inserted in the given leveldart (use only in MRMaps) */ @@ -685,6 +682,12 @@ public: template unsigned int getNbOrbits(const FunctorSelect& good = allDarts) ; + //! For an orbit of a given dimension, return the number of incident cells of an other given dimension + /*! @param d a dart + */ + template + unsigned int degree(Dart d); + protected: /// boundary marker Mark m_boundaryMarker ; diff --git a/include/Topology/generic/genericmap.hpp b/include/Topology/generic/genericmap.hpp index 8083a80422b9bf087ff15ca27bac01e8a902786f..4291de71d5d96dbbac67b48e73444d2eddced3c3 100644 --- a/include/Topology/generic/genericmap.hpp +++ b/include/Topology/generic/genericmap.hpp @@ -24,6 +24,7 @@ #include "Topology/generic/dartmarker.h" #include "Topology/generic/traversorCell.h" +#include "Topology/generic/traversorFactory.h" namespace CGoGN { @@ -611,6 +612,16 @@ unsigned int GenericMap::getNbOrbits(const FunctorSelect& good) return fcount.getNb(); } +template +unsigned int GenericMap::degree(Dart d) +{ + assert(ORBIT != INCIDENT || !"degree does not manage adjacency counting"); + Traversor* t = TraversorFactory::createIncident(*this, d, dimension(), ORBIT, INCIDENT) ; + FunctorCount fcount ; + t->applyFunctor(fcount) ; + return fcount.getNb() ; +} + template void GenericMap::boundaryMarkOrbit(Dart d) { diff --git a/include/Topology/generic/traversor1.h b/include/Topology/generic/traversor1.h index 71c8768ff2929cc9f272afacafa223ec53091d2a..5c705797fa7cca49bc5f270a41ac217b472fadef 100644 --- a/include/Topology/generic/traversor1.h +++ b/include/Topology/generic/traversor1.h @@ -22,14 +22,11 @@ * * *******************************************************************************/ - -#include "Topology/generic/traversorGen.h" - #ifndef __TRAVERSOR1_H__ #define __TRAVERSOR1_H__ #include "Topology/generic/dart.h" - +#include "Topology/generic/traversorGen.h" namespace CGoGN { diff --git a/include/Topology/generic/traversor2.h b/include/Topology/generic/traversor2.h index e8c9c43b0872287db107cbe21304a63993a492b8..e25d5f25be4f5b9b536e866acfe9d2e6a4f36951 100644 --- a/include/Topology/generic/traversor2.h +++ b/include/Topology/generic/traversor2.h @@ -22,14 +22,11 @@ * * *******************************************************************************/ -#include "Topology/generic/traversorGen.h" - - #ifndef __TRAVERSOR2_H__ #define __TRAVERSOR2_H__ - #include "Topology/generic/dart.h" +#include "Topology/generic/traversorGen.h" namespace CGoGN { diff --git a/include/Topology/generic/traversor3.h b/include/Topology/generic/traversor3.h index 435eaeaed56b2d47e8937786981d3262f1fda53e..e7486dc057d7cf8eded27948c4d1422a89535cc7 100644 --- a/include/Topology/generic/traversor3.h +++ b/include/Topology/generic/traversor3.h @@ -25,11 +25,11 @@ #ifndef __TRAVERSOR3_H__ #define __TRAVERSOR3_H__ +#include "Topology/generic/dart.h" +#include "Topology/generic/cellmarker.h" #include "Topology/generic/traversorCell.h" #include "Topology/generic/traversorGen.h" #include "Topology/generic/traversorDoO.h" -#include "Topology/generic/dart.h" -#include "Topology/generic/cellmarker.h" namespace CGoGN { diff --git a/include/Topology/generic/traversorCell.h b/include/Topology/generic/traversorCell.h index 7f5127a213c20d4849eeee09e42a3030c5e9bcc8..bfcd88c73a897db8e4feef11ad220a9cb316b3c5 100644 --- a/include/Topology/generic/traversorCell.h +++ b/include/Topology/generic/traversorCell.h @@ -80,7 +80,6 @@ public: {} }; - template class TraversorF : public TraversorCell { diff --git a/include/Topology/generic/traversorCell.hpp b/include/Topology/generic/traversorCell.hpp index 449ab25eaa54920ae91007c8c5da057578443365..62c68f2b060f203b338cf99360882aa9451eb26a 100644 --- a/include/Topology/generic/traversorCell.hpp +++ b/include/Topology/generic/traversorCell.hpp @@ -153,35 +153,4 @@ void TraversorCell::skip(Dart d) cmark->mark(d) ; } -// -//template -//TraversorDartsOfOrbit::TraversorDartsOfOrbit(MAP& map, Dart d, unsigned int thread) -//{ -// m_vd.reserve(16); -// FunctorStoreNotBoundary fs(map, m_vd); -// map.template foreach_dart_of_orbit(d, fs, thread); -// m_vd.push_back(NIL); -//} -// -//template -//Dart TraversorDartsOfOrbit::begin() -//{ -// m_current = m_vd.begin(); -// return *m_current; -//} -// -//template -//Dart TraversorDartsOfOrbit::end() -//{ -// return NIL; -//} -// -//template -//Dart TraversorDartsOfOrbit::next() -//{ -// if (*m_current != NIL) -// m_current++; -// return *m_current; -//} - } // namespace CGoGN diff --git a/include/Topology/generic/traversorDoO.h b/include/Topology/generic/traversorDoO.h index 87c77e259e4a1a08f47a26fe592d21ac84d0de0b..11a4bc27466fa4fda5c486775f7977dcb778ea74 100644 --- a/include/Topology/generic/traversorDoO.h +++ b/include/Topology/generic/traversorDoO.h @@ -25,10 +25,8 @@ #ifndef __TRAVERSOR_DOO_H__ #define __TRAVERSOR_DOO_H__ -#include "Topology/generic/traversorGen.h" - #include "Topology/generic/dart.h" - +#include "Topology/generic/traversorGen.h" namespace CGoGN { diff --git a/include/Topology/generic/traversorDoO.hpp b/include/Topology/generic/traversorDoO.hpp index cdd6c965852e78d9e839b4b08c355d844ef2e6e5..4149a2fea56c1311701389b8f32183838304629f 100644 --- a/include/Topology/generic/traversorDoO.hpp +++ b/include/Topology/generic/traversorDoO.hpp @@ -25,11 +25,9 @@ #include "Topology/generic/genericmap.h" #include "Topology/generic/functor.h" - namespace CGoGN { - template TraversorDartsOfOrbit::TraversorDartsOfOrbit(MAP& map, Dart d, unsigned int thread) { diff --git a/include/Topology/generic/traversorFactory.h b/include/Topology/generic/traversorFactory.h index b4137245e0a36fffe3f75a135375da430bc56aa4..48953e2e5c80b11918bafbf4d692d3959e0fd76b 100644 --- a/include/Topology/generic/traversorFactory.h +++ b/include/Topology/generic/traversorFactory.h @@ -23,9 +23,7 @@ *******************************************************************************/ #ifndef __TRAVERSORFACTORY_H__ -#define __TRAVERSORGEN_H__ - -#include "Topology/generic/traversorGen.h" +#define __TRAVERSORFACTORY_H__ namespace CGoGN { diff --git a/include/Topology/generic/traversorFactory.hpp b/include/Topology/generic/traversorFactory.hpp index 04bd8e1a3c9de7d7d51411175f52df3e1423357d..8c55309f6419def432c4e899ede03ceb86e7510f 100644 --- a/include/Topology/generic/traversorFactory.hpp +++ b/include/Topology/generic/traversorFactory.hpp @@ -21,6 +21,7 @@ * Contact information: cgogn@unistra.fr * * * *******************************************************************************/ + #include "Topology/generic/traversor1.h" #include "Topology/generic/traversor2.h" #include "Topology/generic/traversor3.h" @@ -33,7 +34,6 @@ namespace CGoGN template Traversor* TraversorFactory::createIncident(MAP& map, Dart dart, unsigned int dim, unsigned int orbX, unsigned int orbY) { - int code = 0x100*dim + 0x10*(orbX-VERTEX) + orbY-VERTEX; switch(code) @@ -78,7 +78,6 @@ Traversor* TraversorFactory::createIncident(MAP& map, Dart dart, unsig return new Traversor3XY(map,dart); break; - case 0x201: return new Traversor2VE(map,dart); break; @@ -112,12 +111,9 @@ Traversor* TraversorFactory::createIncident(MAP& map, Dart dart, unsig return NULL; } - - template Traversor* TraversorFactory::createAdjacent(MAP& map, Dart dart, unsigned int dim, unsigned int orbX, unsigned int orbY) { - int code = 0x100*dim + 0x10*(orbX-VERTEX) + orbY-VERTEX; switch(code) @@ -162,7 +158,6 @@ Traversor* TraversorFactory::createAdjacent(MAP& map, Dart dart, unsig return new Traversor3XXaY(map,dart); break; - case 0x201: return new Traversor2VVaE(map,dart); break; @@ -182,7 +177,6 @@ Traversor* TraversorFactory::createAdjacent(MAP& map, Dart dart, unsig return new Traversor2FFaE(map,dart); break; - case 0x101: return new Traversor1VVaE(map,dart); break; @@ -197,45 +191,44 @@ Traversor* TraversorFactory::createAdjacent(MAP& map, Dart dart, unsig return NULL; } - template Traversor* TraversorFactory::createCell(MAP& map, unsigned int orb, const FunctorSelect& good, bool forceDartMarker, unsigned int thread) { switch(orb) { - case VERTEX: - return new TraversorCell(map,good,forceDartMarker,thread); - break; - case EDGE: - return new TraversorCell(map,good,forceDartMarker,thread); - break; - case FACE: - return new TraversorCell(map,good,forceDartMarker,thread); - break; - case VOLUME: - return new TraversorCell(map,good,forceDartMarker,thread); - break; - case CC: - return new TraversorCell(map,good,forceDartMarker,thread); - break; - case VERTEX1: - return new TraversorCell(map,good,forceDartMarker,thread); - break; - case EDGE1: - return new TraversorCell(map,good,forceDartMarker,thread); - break; - case VERTEX2: - return new TraversorCell(map,good,forceDartMarker,thread); - break; - case EDGE2: - return new TraversorCell(map,good,forceDartMarker,thread); - break; - case FACE2: - return new TraversorCell(map,good,forceDartMarker,thread); - break; - default: - return NULL; - break; + case VERTEX: + return new TraversorCell(map,good,forceDartMarker,thread); + break; + case EDGE: + return new TraversorCell(map,good,forceDartMarker,thread); + break; + case FACE: + return new TraversorCell(map,good,forceDartMarker,thread); + break; + case VOLUME: + return new TraversorCell(map,good,forceDartMarker,thread); + break; + case CC: + return new TraversorCell(map,good,forceDartMarker,thread); + break; + case VERTEX1: + return new TraversorCell(map,good,forceDartMarker,thread); + break; + case EDGE1: + return new TraversorCell(map,good,forceDartMarker,thread); + break; + case VERTEX2: + return new TraversorCell(map,good,forceDartMarker,thread); + break; + case EDGE2: + return new TraversorCell(map,good,forceDartMarker,thread); + break; + case FACE2: + return new TraversorCell(map,good,forceDartMarker,thread); + break; + default: + return NULL; + break; } } @@ -244,43 +237,40 @@ Traversor* TraversorFactory::createDartsOfOrbits(MAP& map, Dart dart, { switch(orb) { - case VERTEX: - return new TraversorDartsOfOrbit(map,dart); - break; - case EDGE: - return new TraversorDartsOfOrbit(map,dart); - break; - case FACE: - return new TraversorDartsOfOrbit(map,dart); - break; - case VOLUME: - return new TraversorDartsOfOrbit(map,dart); - break; - case CC: - return new TraversorDartsOfOrbit(map,dart); - break; - case VERTEX1: - return new TraversorDartsOfOrbit(map,dart); - break; - case EDGE1: - return new TraversorDartsOfOrbit(map,dart); - break; - case VERTEX2: - return new TraversorDartsOfOrbit(map,dart); - break; - case EDGE2: - return new TraversorDartsOfOrbit(map,dart); - break; - case FACE2: - return new TraversorDartsOfOrbit(map,dart); - break; - default: - return NULL; - break; + case VERTEX: + return new TraversorDartsOfOrbit(map,dart); + break; + case EDGE: + return new TraversorDartsOfOrbit(map,dart); + break; + case FACE: + return new TraversorDartsOfOrbit(map,dart); + break; + case VOLUME: + return new TraversorDartsOfOrbit(map,dart); + break; + case CC: + return new TraversorDartsOfOrbit(map,dart); + break; + case VERTEX1: + return new TraversorDartsOfOrbit(map,dart); + break; + case EDGE1: + return new TraversorDartsOfOrbit(map,dart); + break; + case VERTEX2: + return new TraversorDartsOfOrbit(map,dart); + break; + case EDGE2: + return new TraversorDartsOfOrbit(map,dart); + break; + case FACE2: + return new TraversorDartsOfOrbit(map,dart); + break; + default: + return NULL; + break; } } - } - - diff --git a/include/Topology/generic/traversorGen.h b/include/Topology/generic/traversorGen.h index bf4e4fd4e0903c187638cfddae212b7647f1f7bf..775821f9d943fdb1d46837a4bdbabc028b1c2039 100644 --- a/include/Topology/generic/traversorGen.h +++ b/include/Topology/generic/traversorGen.h @@ -26,6 +26,7 @@ #define __TRAVERSORGEN_H__ #include "Topology/generic/dart.h" +#include "Topology/generic/functor.h" namespace CGoGN { @@ -39,6 +40,17 @@ public: virtual Dart end() = 0; virtual Dart next() = 0; + bool applyFunctor(FunctorType& f, const FunctorSelect& good = allDarts) + { + for (Dart d = begin(); d != end(); d = next()) + { + if (good(d)) + if (f(d)) + return true; + } + return false; + } + /** * Factory of incident traversors creation * @param map the map in which we work @@ -48,7 +60,7 @@ public: * @param orbY incident to cell * @return a ptr on Generic Traversor */ - static Traversor* createIncident(MAP& map, Dart dart, unsigned int dim, unsigned int orbX, unsigned int orbY); +// static Traversor* createIncident(MAP& map, Dart dart, unsigned int dim, unsigned int orbX, unsigned int orbY); /** * Factory of adjacent traversors creation @@ -59,7 +71,7 @@ public: * @param orbY incident to cell * @return a ptr on Generic Traversor */ - static Traversor* createAdjacent(MAP& map, Dart dart, unsigned int dim, unsigned int orbX, unsigned int orbY); +// static Traversor* createAdjacent(MAP& map, Dart dart, unsigned int dim, unsigned int orbX, unsigned int orbY); /** * Factory of darts of orbit traversors creation @@ -68,7 +80,7 @@ public: * @param orb the orbit * @return a ptr on Generic Traversor */ - static Traversor* createDartsOfOrbits(MAP& map, Dart dart, unsigned int orb); +// static Traversor* createDartsOfOrbits(MAP& map, Dart dart, unsigned int orb); /** * Factory of incident traversors creation @@ -78,13 +90,9 @@ public: * @param thread (default value 0) * @return a ptr on Generic Traversor */ - static Traversor* createCell(MAP& map, unsigned int orb, const FunctorSelect& good = allDarts, bool forceDartMarker = false, unsigned int thread = 0); +// static Traversor* createCell(MAP& map, unsigned int orb, const FunctorSelect& good = allDarts, bool forceDartMarker = false, unsigned int thread = 0); }; } // namespace CGoGN - -//#include "Topology/generic/traversorGen.hpp" - #endif - diff --git a/include/Topology/gmap/gmap0.h b/include/Topology/gmap/gmap0.h index 1134f84d276052a2707de2c5e0792aed3149063c..669a608b702ad5219d3c66042a05ce25ae843891 100644 --- a/include/Topology/gmap/gmap0.h +++ b/include/Topology/gmap/gmap0.h @@ -48,7 +48,7 @@ public: virtual std::string mapTypeName() const; - virtual unsigned int dimension(); + virtual unsigned int dimension() const; virtual void clear(bool removeAttrib); diff --git a/include/Topology/gmap/gmap0.hpp b/include/Topology/gmap/gmap0.hpp index d1e83947416793ebcff276e91693a23e3dc3eb07..b6d1018e220a782a89512c14ff15615c2fd8d9de 100644 --- a/include/Topology/gmap/gmap0.hpp +++ b/include/Topology/gmap/gmap0.hpp @@ -42,7 +42,7 @@ inline std::string GMap0::mapTypeName() const return "GMap0"; } -inline unsigned int GMap0::dimension() +inline unsigned int GMap0::dimension() const { return 0; } diff --git a/include/Topology/gmap/gmap1.h b/include/Topology/gmap/gmap1.h index c14a92db9f7fe9d32d1f372d9eaa01f076753ef5..9e25efc403c428990833e6ec9510158235b7c333 100644 --- a/include/Topology/gmap/gmap1.h +++ b/include/Topology/gmap/gmap1.h @@ -47,7 +47,7 @@ public: virtual std::string mapTypeName() const; - virtual unsigned int dimension(); + virtual unsigned int dimension() const; virtual void clear(bool removeAttrib); diff --git a/include/Topology/gmap/gmap1.hpp b/include/Topology/gmap/gmap1.hpp index a6b4b0fdbd976957401453bb9313ba878df47c60..16a87e314776f63dc5bcbe5f158b2bf909b9a2c0 100644 --- a/include/Topology/gmap/gmap1.hpp +++ b/include/Topology/gmap/gmap1.hpp @@ -40,7 +40,7 @@ inline std::string GMap1::mapTypeName() const return "GMap1"; } -inline unsigned int GMap1::dimension() +inline unsigned int GMap1::dimension() const { return 1; } diff --git a/include/Topology/gmap/gmap2.h b/include/Topology/gmap/gmap2.h index 245968bb20a421f100d28e904db8deef7d065707..d96097922315d7c5b08186af1a069e277bf1aa43 100644 --- a/include/Topology/gmap/gmap2.h +++ b/include/Topology/gmap/gmap2.h @@ -54,7 +54,7 @@ public: virtual std::string mapTypeName() const; - virtual unsigned int dimension(); + virtual unsigned int dimension() const; virtual void clear(bool removeAttrib); diff --git a/include/Topology/gmap/gmap2.hpp b/include/Topology/gmap/gmap2.hpp index 7a441d9e06dbdb756c6ce50fb8e7520cfeac16b6..dd767989f871609d0905c68a44111471aeea2378 100644 --- a/include/Topology/gmap/gmap2.hpp +++ b/include/Topology/gmap/gmap2.hpp @@ -40,7 +40,7 @@ inline std::string GMap2::mapTypeName() const return "GMap2"; } -inline unsigned int GMap2::dimension() +inline unsigned int GMap2::dimension() const { return 2; } diff --git a/include/Topology/gmap/gmap3.h b/include/Topology/gmap/gmap3.h index d7bb900f5e71fc85f9574b50ea18bdccc8face85..4e5097458386a726283d8780d902c14ae35b42d4 100644 --- a/include/Topology/gmap/gmap3.h +++ b/include/Topology/gmap/gmap3.h @@ -60,7 +60,7 @@ public: virtual std::string mapTypeName() const; - virtual unsigned int dimension(); + virtual unsigned int dimension() const; virtual void clear(bool removeAttrib); diff --git a/include/Topology/gmap/gmap3.hpp b/include/Topology/gmap/gmap3.hpp index 90a704339434b883e2d408ca97855552763e96d0..278a95e2334927307903ec477aaac942086aa127 100644 --- a/include/Topology/gmap/gmap3.hpp +++ b/include/Topology/gmap/gmap3.hpp @@ -40,7 +40,7 @@ inline std::string GMap3::mapTypeName() const return "GMap3"; } -inline unsigned int GMap3::dimension() +inline unsigned int GMap3::dimension() const { return 3; } diff --git a/include/Topology/map/map1.h b/include/Topology/map/map1.h index a4ab07243de4e094469054d7c378cad517bcccd1..be6ec9ed0a8d5fb9afb6e8993ff391899fff6e44 100644 --- a/include/Topology/map/map1.h +++ b/include/Topology/map/map1.h @@ -53,7 +53,7 @@ public: virtual std::string mapTypeName() const; - virtual unsigned int dimension(); + virtual unsigned int dimension() const; virtual void clear(bool removeAttrib); diff --git a/include/Topology/map/map1.hpp b/include/Topology/map/map1.hpp index 5f1b93f332932cf2fb36ca4448dc51a791f52d3e..1fb71bafc972f766c58d7f7360ed55a631ae34e9 100644 --- a/include/Topology/map/map1.hpp +++ b/include/Topology/map/map1.hpp @@ -43,7 +43,7 @@ inline std::string Map1::mapTypeName() const return "Map1" ; } -inline unsigned int Map1::dimension() +inline unsigned int Map1::dimension() const { return 1 ; } diff --git a/include/Topology/map/map2.h b/include/Topology/map/map2.h index b7e11b4b00949100314cd5c31c6b498b34892f30..44cee20203ea949e7e90f67b6a5bb94888ec3e07 100644 --- a/include/Topology/map/map2.h +++ b/include/Topology/map/map2.h @@ -66,7 +66,7 @@ public: virtual std::string mapTypeName() const; - virtual unsigned int dimension(); + virtual unsigned int dimension() const; virtual void clear(bool removeAttrib); @@ -134,7 +134,7 @@ public: //! Delete the face of d /*! @param d a dart of the face - * @param withBoudary create or extend boundary face instead of fixed points (default true) + * @param withBoudary create or extend boundary face instead of fixed points (default true) */ virtual void deleteFace(Dart d, bool withBoundary = true) ; diff --git a/include/Topology/map/map2.hpp b/include/Topology/map/map2.hpp index 9b9ecd13e549c77b5b668ad207e3fe400a4cc4f3..a3b0a24c45d2a2a61d84973196114d4096943369 100644 --- a/include/Topology/map/map2.hpp +++ b/include/Topology/map/map2.hpp @@ -42,7 +42,7 @@ inline std::string Map2::mapTypeName() const return "Map2" ; } -inline unsigned int Map2::dimension() +inline unsigned int Map2::dimension() const { return 2 ; } diff --git a/include/Topology/map/map3.h b/include/Topology/map/map3.h index 95660b6549ad02f039ff0296369c7e5e8541ca23..6863220b87ffd990b094e6c0329078de1b413708 100644 --- a/include/Topology/map/map3.h +++ b/include/Topology/map/map3.h @@ -74,7 +74,7 @@ public: virtual std::string mapTypeName() const; - virtual unsigned int dimension(); + virtual unsigned int dimension() const; virtual void clear(bool removeAttrib); diff --git a/include/Topology/map/map3.hpp b/include/Topology/map/map3.hpp index efcceb5511aa78a412667639674845bd80a578cf..aabdae0380011bd2bd9e3055bed90acd805c0baa 100644 --- a/include/Topology/map/map3.hpp +++ b/include/Topology/map/map3.hpp @@ -40,7 +40,7 @@ inline std::string Map3::mapTypeName() const return "Map3"; } -inline unsigned int Map3::dimension() +inline unsigned int Map3::dimension() const { return 3; }