genericmap.h 15.6 KB
Newer Older
Pierre Kraemer's avatar
Pierre Kraemer committed
1 2 3
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps  *
* version 0.1                                                                  *
4
* Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg           *
Pierre Kraemer's avatar
Pierre Kraemer committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
*                                                                              *
* 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.           *
*                                                                              *
20
* Web site: http://cgogn.unistra.fr/                                           *
Pierre Kraemer's avatar
Pierre Kraemer committed
21 22 23 24 25 26 27 28
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#ifndef __GENERIC_MAP__
#define __GENERIC_MAP__

#include <iostream>
Sylvain Thery's avatar
Sylvain Thery committed
29
#include <string>
Pierre Kraemer's avatar
Pierre Kraemer committed
30 31 32 33 34 35
#include <sstream>
#include <fstream>
#include <iomanip>
#include <list>
#include <vector>
#include <map>
36 37
#include <boost/thread/mutex.hpp>

38
#include "Container/attributeContainer.h"
Sylvain Thery's avatar
Sylvain Thery committed
39
#include "Container/fakeAttribute.h"
40

Pierre Kraemer's avatar
Pierre Kraemer committed
41 42 43 44
#include "Topology/generic/dart.h"
#include "Topology/generic/marker.h"
#include "Topology/generic/functor.h"

Sylvain Thery's avatar
Sylvain Thery committed
45 46


Pierre Kraemer's avatar
Pierre Kraemer committed
47 48 49
namespace CGoGN
{

50
class AttributeHandlerGen ;
51 52
class DartMarkerGen ;
class CellMarkerGen ;
53
//template<typename MAP, unsigned int CELL> class CellMarkerBase ;
54

55
class GenericMap
Pierre Kraemer's avatar
Pierre Kraemer committed
56
{
Pierre Kraemer's avatar
Pierre Kraemer committed
57 58 59 60 61 62
	template<typename T, unsigned int ORBIT, typename MAP> friend class AttributeHandler ;
	template<typename T, typename MAP> friend class DartAutoAttribute ;
	template<typename T, typename MAP> friend class VertexAutoAttribute ;
	template<typename T, typename MAP> friend class EdgeAutoAttribute ;
	template<typename T, typename MAP> friend class FaceAutoAttribute ;
	template<typename T, typename MAP> friend class VolumeAutoAttribute ;
63
	friend class DartMarkerGen ;
Sylvain Thery's avatar
Sylvain Thery committed
64
	friend class CellMarkerGen ;
65
	template<typename MAP, unsigned int CELL> friend class CellMarkerBase ;
Pierre Kraemer's avatar
Pierre Kraemer committed
66 67 68 69 70

protected:
	/**
	 * Attributes Containers
	 */
71
	AttributeContainer m_attribs[NB_ORBITS] ;
Pierre Kraemer's avatar
Pierre Kraemer committed
72

73
	static std::map<std::string, RegisteredBaseAttribute*>* m_attributes_registry_map ;
74 75
	static int m_nbInstances;

Pierre Kraemer's avatar
Pierre Kraemer committed
76 77
	/**
	 * Direct access to the Dart attributes that store the orbits embeddings
78
	 * (only initialized when necessary, i.e. addEmbedding function)
Pierre Kraemer's avatar
Pierre Kraemer committed
79
	 */
80
	AttributeMultiVector<unsigned int>* m_embeddings[NB_ORBITS] ;
Pierre Kraemer's avatar
Pierre Kraemer committed
81

Pierre Kraemer's avatar
Pierre Kraemer committed
82 83 84 85 86
	/**
	 * Direct access to quick traversal attributes
	 * (initialized by enableQuickTraversal function)
	 */
	AttributeMultiVector<Dart>* m_quickTraversal[NB_ORBITS] ;
Sylvain Thery's avatar
Sylvain Thery committed
87 88 89
	AttributeMultiVector<NoTypeNameAttribute<std::vector<Dart> > >* m_quickLocalIncidentTraversal[NB_ORBITS][NB_ORBITS] ;
	AttributeMultiVector<NoTypeNameAttribute<std::vector<Dart> > >* m_quickLocalAdjacentTraversal[NB_ORBITS][NB_ORBITS] ;

Pierre Kraemer's avatar
Pierre Kraemer committed
90
	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
91
	 * Marks manager
Pierre Kraemer's avatar
Pierre Kraemer committed
92
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
93
	MarkSet m_marksets[NB_ORBITS][NB_THREAD] ;
Pierre Kraemer's avatar
Pierre Kraemer committed
94 95 96 97

	/**
	 * Direct access to the attributes that store Marks
	 */
98 99 100
	AttributeMultiVector<Mark>* m_markTables[NB_ORBITS][NB_THREAD] ;

	unsigned int m_nbThreads ;
Sylvain Thery's avatar
Sylvain Thery committed
101

102 103 104
	/**
	 * Store links to created AttributeHandlers, DartMarkers and CellMarkers
	 */
105
	std::multimap<AttributeMultiVectorGen*, AttributeHandlerGen*> attributeHandlers ; // TODO think of MT (AttributeHandler creation & release are not thread safe!)
106 107
	boost::mutex attributeHandlersMutex;

108 109 110
	std::vector<DartMarkerGen*> dartMarkers[NB_THREAD] ;
	std::vector<CellMarkerGen*> cellMarkers[NB_THREAD] ;

Pierre Kraemer's avatar
Pierre Kraemer committed
111 112
	void init();

Pierre Kraemer's avatar
Pierre Kraemer committed
113
public:
114
	static const unsigned int UNKNOWN_ATTRIB = AttributeContainer::UNKNOWN ;
Pierre Kraemer's avatar
Pierre Kraemer committed
115

116
	GenericMap() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
117

Sylvain Thery's avatar
Sylvain Thery committed
118
	virtual ~GenericMap() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
119

120
	virtual std::string mapTypeName() const = 0 ;
121

122 123
	virtual unsigned int dimension() const = 0 ;

124 125 126 127 128 129 130
	/**
	 * Clear the map
	 * @param removeAttrib
	 *   if false -> data is deleted but all attributes remain (all AttributeHandlers are still valid)
	 *   if true -> data and attributes are deleted (AttributeHandlers are invalid)
	 */
	virtual void clear(bool removeAttrib) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
131

Sylvain Thery's avatar
Sylvain Thery committed
132 133 134
	/**
	 * get the marker_set of an orbit and thread (used for Cell & Dart Marker)
	 */
135 136
	template <unsigned int ORBIT>
	MarkSet& getMarkerSet(unsigned int thread = 0) { return m_marksets[ORBIT][thread]; }
Sylvain Thery's avatar
Sylvain Thery committed
137

Pierre Kraemer's avatar
Pierre Kraemer committed
138 139 140 141 142 143 144
	/****************************************
	 *           DARTS MANAGEMENT           *
	 ****************************************/
protected:
	/**
	 * Add a dart to the map
	 */
145
	virtual Dart newDart() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
146 147 148 149

	/**
	 * Erase a dart of the map
	 */
150
	virtual void deleteDart(Dart d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
151

152 153 154
	/**
	 * create a copy of a dart (based on its index in m_attribs[DART]) and returns its index
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
155
	unsigned int copyDartLine(unsigned int index) ;
156

Pierre Kraemer's avatar
Pierre Kraemer committed
157 158
	/**
	 * Properly deletes a dart in m_attribs[DART]
159 160 161
	 */
	void deleteDartLine(unsigned int index) ;

Pierre Kraemer's avatar
Pierre Kraemer committed
162 163 164
	/****************************************
	 *         EMBEDDING MANAGEMENT         *
	 ****************************************/
Pierre Kraemer's avatar
Pierre Kraemer committed
165
public:
Pierre Kraemer's avatar
Pierre Kraemer committed
166 167 168
	/**
	 * tell if an orbit is embedded or not
	 */
169 170
	template <unsigned int ORBIT>
	bool isOrbitEmbedded() const ;
Pierre Kraemer's avatar
Pierre Kraemer committed
171

172
	bool isOrbitEmbedded(unsigned int orbit) const ;
Pierre Kraemer's avatar
Pierre Kraemer committed
173 174 175 176 177 178

	/**
	 * Allocation of some place in attrib table
	 * @param orbit the orbit of embedding
	 * @return the index to use as embedding
	 */
179 180
	template <unsigned int ORBIT>
	unsigned int newCell() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
181 182 183 184 185 186 187

	/**
	 * Line of attributes i is overwritten with line j
	 * @param orbit attribute orbit to use
	 * @param i line destination of copy
	 * @param j line source of copy
	 */
188 189
	template <unsigned int ORBIT>
	void copyCell(unsigned int i, unsigned int j) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
190 191 192 193 194 195

	/**
	 * Line of attributes i is initialized
	 * @param orbit attribute orbit to use
	 * @param i line to init
	 */
196 197
	template <unsigned int ORBIT>
	void initCell(unsigned int i) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
198

Pierre Kraemer's avatar
Pierre Kraemer committed
199 200 201 202
	/****************************************
	 *     QUICK TRAVERSAL MANAGEMENT       *
	 ****************************************/

Pierre Kraemer's avatar
Pierre Kraemer committed
203
	template <typename MAP, unsigned int ORBIT>
Pierre Kraemer's avatar
Pierre Kraemer committed
204 205
	void enableQuickTraversal() ;

Pierre Kraemer's avatar
Pierre Kraemer committed
206
	template <typename MAP, unsigned int ORBIT>
207
	void updateQuickTraversal() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
208 209

	template <unsigned int ORBIT>
Sylvain Thery's avatar
Sylvain Thery committed
210
	const AttributeMultiVector<Dart>* getQuickTraversal() const;
Pierre Kraemer's avatar
Pierre Kraemer committed
211 212 213 214

	template <unsigned int ORBIT>
	void disableQuickTraversal() ;

Sylvain Thery's avatar
Sylvain Thery committed
215
	template <typename MAP, unsigned int ORBIT, unsigned int INCI>
Sylvain Thery's avatar
Sylvain Thery committed
216
	void enableQuickIncidentTraversal();
Sylvain Thery's avatar
Sylvain Thery committed
217 218

	template <typename MAP, unsigned int ORBIT, unsigned int INCI>
Sylvain Thery's avatar
Sylvain Thery committed
219
	void updateQuickIncidentTraversal();
Sylvain Thery's avatar
Sylvain Thery committed
220 221

	template <unsigned int ORBIT, unsigned int INCI>
Sylvain Thery's avatar
Sylvain Thery committed
222
	const AttributeMultiVector<NoTypeNameAttribute<std::vector<Dart> > >* getQuickIncidentTraversal() const;
Sylvain Thery's avatar
Sylvain Thery committed
223 224

	template <unsigned int ORBIT, unsigned int INCI>
Sylvain Thery's avatar
Sylvain Thery committed
225
	void disableQuickIncidentTraversal();
Sylvain Thery's avatar
Sylvain Thery committed
226 227

	template <typename MAP, unsigned int ORBIT, unsigned int ADJ>
Sylvain Thery's avatar
Sylvain Thery committed
228
	void enableQuickAdjacentTraversal();
Sylvain Thery's avatar
Sylvain Thery committed
229 230

	template <typename MAP, unsigned int ORBIT, unsigned int ADJ>
Sylvain Thery's avatar
Sylvain Thery committed
231
	void updateQuickAdjacentTraversal();
Sylvain Thery's avatar
Sylvain Thery committed
232 233

	template <unsigned int ORBIT, unsigned int INCI>
Sylvain Thery's avatar
Sylvain Thery committed
234
	const AttributeMultiVector<NoTypeNameAttribute<std::vector<Dart> > >* getQuickAdjacentTraversal() const;
Sylvain Thery's avatar
Sylvain Thery committed
235 236

	template <unsigned int ORBIT, unsigned int ADJ>
Sylvain Thery's avatar
Sylvain Thery committed
237
	void disableQuickAdjacentTraversal();
Sylvain Thery's avatar
Sylvain Thery committed
238

Pierre Kraemer's avatar
Pierre Kraemer committed
239 240 241 242
	/****************************************
	 *        ATTRIBUTES MANAGEMENT         *
	 ****************************************/

243 244 245 246 247 248
	/**
	 * get the number of cell in the attribute container of an orbit
	 * @param orb the orbit to get number of cells
	 */
	unsigned int getNbCells(unsigned int orbit);

Pierre Kraemer's avatar
Pierre Kraemer committed
249
	/**
250 251
	 * get the attrib container of a given orbit
	 * @param orbit the orbit !!! (bilbo the orbit !)
Pierre Kraemer's avatar
Pierre Kraemer committed
252
	 */
253 254
	template <unsigned int ORBIT>
	AttributeContainer& getAttributeContainer() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
255

Sylvain Thery's avatar
Sylvain Thery committed
256 257 258
	template <unsigned int ORBIT>
	const AttributeContainer& getAttributeContainer() const;

Pierre Kraemer's avatar
Pierre Kraemer committed
259 260
	AttributeContainer& getAttributeContainer(unsigned int orbit) ;

Sylvain Thery's avatar
Sylvain Thery committed
261 262
	const AttributeContainer& getAttributeContainer(unsigned int orbit) const;

Pierre Kraemer's avatar
Pierre Kraemer committed
263
	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
264
	 * get a multi vector of mark attribute (direct access with [i])
Pierre Kraemer's avatar
Pierre Kraemer committed
265
	 */
266 267
	template <unsigned int ORBIT>
	AttributeMultiVector<Mark>* getMarkVector(unsigned int thread = 0) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
268 269

	/**
270 271
	 * return a pointer to the Dart attribute vector that store the embedding of the given orbit
	 * (may be NULL if the orbit is not embedded)
Pierre Kraemer's avatar
Pierre Kraemer committed
272
	 */
273 274
	template <unsigned int ORBIT>
	AttributeMultiVector<unsigned int>* getEmbeddingAttributeVector() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
275

untereiner's avatar
untereiner committed
276 277 278 279
	/**
	 * swap two attribute containers
	 */
	void swapEmbeddingContainers(unsigned int orbit1, unsigned int orbit2) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
280 281 282 283 284 285 286

	/**
	 * static function for type registration
	 */
	template <typename R>
	static bool registerAttribute(const std::string &nameType) ;

287 288 289 290 291
	/**
	 * print attributes name of map in std::cout (for debugging)
	 */
	void viewAttributesTables() ;

292 293
	void printDartsTable();

Sylvain Thery's avatar
Sylvain Thery committed
294 295 296 297 298 299 300
protected:
	/****************************************
	 *   EMBEDDING ATTRIBUTES MANAGEMENT    *
	 ****************************************/
	/**
	 * Create the dart attribute to store the embedding of this orbit (for internal use only)
	 */
301 302
	template <unsigned int ORBIT>
	void addEmbedding() ;
Sylvain Thery's avatar
Sylvain Thery committed
303 304 305 306 307 308

	/****************************************
	 *  TOPOLOGICAL ATTRIBUTES MANAGEMENT   *
	 ****************************************/

	/**
309
	 * Add a topological relation in the map
Sylvain Thery's avatar
Sylvain Thery committed
310 311 312 313
	 * @param name name of relation
	 */
	AttributeMultiVector<Dart>* addRelation(const std::string& name) ;

Sylvain Thery's avatar
Sylvain Thery committed
314
	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
315 316
	 * Get AttributeMultivector pointer of a relation attribute
	 * @param name name of the relation
Sylvain Thery's avatar
Sylvain Thery committed
317 318
	 * @return the attribute multi-vector pointer
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
319
	AttributeMultiVector<Dart>* getRelation(const std::string& name) ;
Sylvain Thery's avatar
Sylvain Thery committed
320

Sylvain Thery's avatar
Sylvain Thery committed
321
	/****************************************
322
	 *          THREAD MANAGEMENT           *
Sylvain Thery's avatar
Sylvain Thery committed
323 324 325 326 327 328 329
	 ****************************************/
public:
	/**
	 * add  threads (a table of Marker per orbit for each thread)
	 * to allow MT
	 * @param nb thread to add
	 */
330
	void addThreadMarker(unsigned int nb) ;
Sylvain Thery's avatar
Sylvain Thery committed
331 332 333 334 335

	/**
	 * return allowed threads
	 * @return the number of threads (including principal)
	 */
336
	unsigned int getNbThreadMarkers() ;
Sylvain Thery's avatar
Sylvain Thery committed
337 338

	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
339
	 * Remove some added threads
Sylvain Thery's avatar
Sylvain Thery committed
340 341
	 * @return remaining number of threads (including principal)
	 */
342
	void removeThreadMarker(unsigned int nb) ;
Sylvain Thery's avatar
Sylvain Thery committed
343

Pierre Kraemer's avatar
Pierre Kraemer committed
344 345 346
	/****************************************
	 *             SAVE & LOAD              *
	 ****************************************/
Pierre Kraemer's avatar
Pierre Kraemer committed
347
protected:
Sylvain Thery's avatar
Sylvain Thery committed
348
	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
349
	 * restore embedding / markers / quick traversal shortcuts
Sylvain Thery's avatar
Sylvain Thery committed
350
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
351
	void restore_shortcuts();
Sylvain Thery's avatar
Sylvain Thery committed
352

Pierre Kraemer's avatar
Pierre Kraemer committed
353
public:
Pierre Kraemer's avatar
Pierre Kraemer committed
354 355 356 357 358
	/**
	 * Save map in a binary file
	 * @param filename the file name
	 * @return true if OK
	 */
359
	virtual bool saveMapBin(const std::string& filename) const = 0;
Pierre Kraemer's avatar
Pierre Kraemer committed
360 361 362 363 364 365

	/**
	 * Load map from a binary file
	 * @param filename the file name
	 * @return true if OK
	 */
366
	virtual bool loadMapBin(const std::string& filename) = 0 ;
Pierre Kraemer's avatar
Pierre Kraemer committed
367

368 369 370
	/**
	 * copy from another map (of same type)
	 */
371
	virtual bool copyFrom(const GenericMap& map) = 0 ;
372

Sylvain Thery's avatar
Sylvain Thery committed
373 374 375
	/**
	 * Dump attributes types and names per orbit
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
376
	void dumpAttributesAndMarkers() ;
Sylvain Thery's avatar
Sylvain Thery committed
377

Pierre Kraemer's avatar
Pierre Kraemer committed
378
protected:
379 380 381
	/**
	 * update topo relation after compacting the container:
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
382
	virtual void compactTopoRelations(const std::vector<unsigned int>& oldnew) = 0 ;
383

Pierre Kraemer's avatar
Pierre Kraemer committed
384
public:
385 386 387
	/**
	 * compact the map
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
388
	void compact() ;
389

Pierre Kraemer's avatar
Pierre Kraemer committed
390 391 392 393
	/****************************************
	 *           DARTS TRAVERSALS           *
	 ****************************************/

394 395 396 397 398
	/**
	 * Apply a functor on each dart of the map
	 * @param f a ref to the functor obj
	 */
	bool foreach_dart(FunctorType& f) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
399

400 401 402
	virtual Dart begin() const;
	virtual Dart end() const;
	virtual void next(Dart& d) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
403 404 405 406 407 408

	//! Apply a functor on every dart of an orbit
	/*! @param dim dimension of orbit
	 *  @param d a dart of the orbit
	 *  @param f a functor obj
	 */
409
	template <unsigned int ORBIT>
Sylvain Thery's avatar
Sylvain Thery committed
410 411 412 413 414 415 416 417
	bool foreach_dart_of_orbit(Dart d, FunctorType& f, unsigned int thread = 0) const;


	virtual bool foreach_dart_of_vertex(Dart d, FunctorType& f, unsigned int thread = 0) const = 0 ;
	virtual bool foreach_dart_of_edge(Dart d, FunctorType& f, unsigned int thread = 0) const = 0 ;
	virtual bool foreach_dart_of_face(Dart /*d*/, FunctorType& /*f*/, unsigned int /*thread = 0*/) const { std::cerr << "Not implemented" << std::endl; return false; }
	virtual bool foreach_dart_of_volume(Dart /*d*/, FunctorType& /*f*/, unsigned /*int thread = 0*/) const { std::cerr << "Not implemented" << std::endl; return false; }
	virtual bool foreach_dart_of_cc(Dart /*d*/, FunctorType& /*f*/, unsigned int /*thread = 0*/) const { std::cerr << "Not implemented" << std::endl; return false; }
Pierre Kraemer's avatar
Pierre Kraemer committed
418

Sylvain Thery's avatar
Sylvain Thery committed
419 420
	virtual bool foreach_dart_of_vertex1(Dart /*d*/, FunctorType& /*f*/, unsigned int /*thread = 0*/) const { std::cerr << "Not implemented" << std::endl; return false; }
	virtual bool foreach_dart_of_edge1(Dart /*d*/, FunctorType& /*f*/, unsigned int /*thread = 0*/) const { std::cerr << "Not implemented" << std::endl; return false; }
421

Sylvain Thery's avatar
Sylvain Thery committed
422 423 424 425
	virtual bool foreach_dart_of_vertex2(Dart /*d*/, FunctorType& /*f*/, unsigned int /*thread = 0*/) const { std::cerr << "Not implemented" << std::endl; return false; }
	virtual bool foreach_dart_of_edge2(Dart /*d*/, FunctorType& /*f*/, unsigned int /*thread = 0*/) const { std::cerr << "Not implemented" << std::endl; return false; }
	virtual bool foreach_dart_of_face2(Dart /*d*/, FunctorType& /*f*/, unsigned int /*thread = 0*/) const { std::cerr << "Not implemented" << std::endl; return false; }

426 427 428 429
	/****************************************
	 *         BOUNDARY MANAGEMENT          *
	 ****************************************/

430
protected:
Thery Sylvain's avatar
Thery Sylvain committed
431 432
	/// boundary markers
	Mark m_boundaryMarkers[2] ; // 0 for dim 2 / 1 for dim 3
433

Pierre Kraemer's avatar
Pierre Kraemer committed
434
protected:
435 436 437
	/**
	 * clear all boundary markers
	 */
Thery Sylvain's avatar
Thery Sylvain committed
438
	template<unsigned int DIM>
Pierre Kraemer's avatar
Pierre Kraemer committed
439
	void boundaryUnmarkAll() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
440 441
} ;

442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473
//
//template <typename MAP>
//bool foreach_dart_of_orbit_in_parent(MAP* ptrMap, unsigned int orbit, Dart d, FunctorType& f, unsigned int thread = 0)
//{
//	switch(orbit)
//	{
//		case  DART: return f(d);
//		case  VERTEX: return ptrMap->MAP::ParentMap::foreach_dart_of_vertex(d, f, thread) ;
//		case  EDGE: return ptrMap->MAP::ParentMap::foreach_dart_of_edge(d, f, thread) ;
//		case  ORIENTED_FACE: return ptrMap->MAP::ParentMap::foreach_dart_of_oriented_face(d, f, thread) ;
//		case  FACE: return ptrMap->MAP::ParentMap::foreach_dart_of_face(d, f, thread) ;
//		case  VOLUME: return ptrMap->MAP::ParentMap::foreach_dart_of_volume(d, f, thread) ;
//		default: assert(!"Cells of this dimension are not handled") ;
//	}
//	return false ;
//}
//
//template <typename MAP>
//bool foreach_dart_of_orbit_in_parent2(MAP* ptrMap, unsigned int orbit, Dart d, FunctorType& f, unsigned int thread = 0)
//{
//	switch(orbit)
//	{
//		case  DART: return f(d);
//		case  VERTEX: return ptrMap->MAP::ParentMap::ParentMap::foreach_dart_of_vertex(d, f,thread) ;
//		case  EDGE: return ptrMap->MAP::ParentMap::ParentMap::foreach_dart_of_edge(d, f, thread) ;
//		case  ORIENTED_FACE: return ptrMap->MAP::ParentMap::ParentMap::foreach_dart_of_oriented_face(d, f, thread) ;
//		case  FACE: return ptrMap->MAP::ParentMap::ParentMap::foreach_dart_of_face(d, f, thread) ;
//		case  VOLUME: return ptrMap->MAP::ParentMap::ParentMap::foreach_dart_of_volume(d, f, thread) ;
//		default: assert(!"Cells of this dimension are not handled") ;
//	}
//	return false ;
//}
474

Pierre Kraemer's avatar
Pierre Kraemer committed
475 476 477 478 479
} //namespace CGoGN

#include "Topology/generic/genericmap.hpp"

#endif