Création d'un compte pour un collaborateur extérieur au laboratoire depuis l'intranet ICube : https://intranet.icube.unistra.fr/fr/labs/member/profile

genericmap.h 15.4 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-2011, 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.u-strasbg.fr/                                         *
Pierre Kraemer's avatar
Pierre Kraemer committed
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#ifndef __GENERIC_MAP__
#define __GENERIC_MAP__

#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <list>
#include <vector>
#include <map>

36
#include "Container/attributeContainer.h"
Pierre Kraemer's avatar
Pierre Kraemer committed
37

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

namespace CGoGN
{

CGoGN GIT Supervisor's avatar
CGoGN GIT Supervisor committed
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
const unsigned int EMBNULL = 0xffffffff;

const unsigned int NB_ORBITS = 6;
const unsigned int NB_THREAD = 16;

const unsigned int VERTEX	= 0;
const unsigned int EDGE		= 1;
const unsigned int ORIENTED_FACE= 2;
const unsigned int FACE		= 3;
const unsigned int VOLUME	= 4;
const unsigned int DART		= 5;
*/

Pierre Kraemer's avatar
Pierre Kraemer committed
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**
 * Class that allows to browse a map
 * This is a pure virtual class that can be overloaded in:
 * - a map (generic and so on)
 * - a MapBrowserSelector
 * - a MapBrowserLinked (Attr or Auto)
 */
class MapBrowser
{
public:
	virtual Dart begin() = 0;
	virtual Dart end() = 0;
	virtual void next(Dart& d) = 0;
};

74
class AttributeHandlerGen ;
75
76
class DartMarkerGen ;
class CellMarkerGen ;
77

Pierre Kraemer's avatar
Pierre Kraemer committed
78
79
class GenericMap : public MapBrowser
{
80
	template<typename T> friend class AttributeHandler ;
Pierre Kraemer's avatar
Pierre Kraemer committed
81
	template<typename T> friend class AutoAttributeHandler ;
82
	friend class DartMarkerGen ;
Sylvain Thery's avatar
Sylvain Thery committed
83
	friend class CellMarkerGen ;
Pierre Kraemer's avatar
Pierre Kraemer committed
84
85
86
87
88

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

91
	static std::map<std::string, RegisteredBaseAttribute*>* m_attributes_registry_map ;
Pierre Kraemer's avatar
Pierre Kraemer committed
92
93
94
95
96

	/**
	 * Direct access to the Dart attributes that store the orbits embeddings
	 * (only initialized when necessary)
	 */
97
	AttributeMultiVector<unsigned int>* m_embeddings[NB_ORBITS] ;
Pierre Kraemer's avatar
Pierre Kraemer committed
98
99

	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
100
	 * Marks manager
Pierre Kraemer's avatar
Pierre Kraemer committed
101
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
102
	MarkSet m_marksets[NB_ORBITS][NB_THREAD] ;
Pierre Kraemer's avatar
Pierre Kraemer committed
103
104
105
106

	/**
	 * Direct access to the attributes that store Marks
	 */
107
108
109
	AttributeMultiVector<Mark>* m_markTables[NB_ORBITS][NB_THREAD] ;

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

111
112
113
	/**
	 * Store links to created AttributeHandlers, DartMarkers and CellMarkers
	 */
114
	std::multimap<AttributeMultiVectorGen*, AttributeHandlerGen*> attributeHandlers ;
115
116
	std::vector<DartMarkerGen*> dartMarkers ;
	std::vector<CellMarkerGen*> cellMarkers ;
Pierre Kraemer's avatar
Pierre Kraemer committed
117
118

public:
119
	static const unsigned int UNKNOWN_ATTRIB = AttributeContainer::UNKNOWN ;
Pierre Kraemer's avatar
Pierre Kraemer committed
120

121
	GenericMap() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
122

123
	~GenericMap() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
124

125
126
127
128
129
130
131
132
133
	virtual std::string mapTypeName() = 0 ;

	/**
	 * 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
134

Sylvain Thery's avatar
Sylvain Thery committed
135
136
137
138
139
	/**
	 * get the marker_set of an orbit and thread (used for Cell & Dart Marker)
	 */
	MarkSet& getMarkerSet(unsigned int orbit, unsigned int thread) { return m_marksets[orbit][thread]; }

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

	/**
	 * Erase a dart of the map
	 */
152
	void deleteDart(Dart d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
153
154
155
156
157
158
159
160
161
162

public:
	/**
	 * return true if the dart d refers to a valid index
	 */
	bool isDartValid(Dart d) ;

	/**
	 * @return the number of darts in the map
	 */
163
	unsigned int getNbDarts() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
164
165
166
167
168
169
170
171

	/****************************************
	 *         EMBEDDING MANAGEMENT         *
	 ****************************************/

	/**
	 * tell if an orbit is embedded or not
	 */
172
	bool isOrbitEmbedded(unsigned int orbit) const ;
Pierre Kraemer's avatar
Pierre Kraemer committed
173
174

	/**
175
	 * return the number of embedded orbits (including DART)
Pierre Kraemer's avatar
Pierre Kraemer committed
176
	 */
177
	unsigned int nbEmbeddings() const ;
Pierre Kraemer's avatar
Pierre Kraemer committed
178
179
180
181
182
183

	/**
	 * get the cell index of the given dimension associated to dart d
	 * (can go through the whole orbit due to lazy embedding)
	 * @return EMBNULL if the orbit of d is not attached to any cell
	 */
184
	unsigned int getEmbedding(unsigned int orbit, Dart d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
185
186
187
188

	/**
	 * Set the cell index of the given dimension associated to dart d
	 */
189
	void setDartEmbedding(unsigned int orbit, Dart d, unsigned int emb) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
190
191
192
193
194
195
196

	/**
	 * Copy the index of the cell associated to a dart over an other dart
	 * @param d the dart to overwrite (dest)
	 * @param e the dart to copy (src)
	 * @param orbit the id of orbit embedding
	 */
197
	void copyDartEmbedding(unsigned int orbit, Dart d, Dart e) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
198
199
200
201
202
203

	/**
	 * Allocation of some place in attrib table
	 * @param orbit the orbit of embedding
	 * @return the index to use as embedding
	 */
204
	unsigned int newCell(unsigned int orbit) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
205
206
207
208
209
210
211

	/**
	* Set the index of the associated cell to all the darts of an orbit
	* @param orbit orbit to embed
	* @param d a dart of the topological vertex
	* @param em index of attribute to store as embedding
	*/
212
	void embedOrbit(unsigned int orbit, Dart d, unsigned int em) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
213
214

	/**
untereiner's avatar
untereiner committed
215
	* Associate an new embedding to all darts of an orbit
Pierre Kraemer's avatar
Pierre Kraemer committed
216
217
218
219
	* @param orbit orbit to embed
	* @param d a dart of the topological cell
	* @return index of the attribute in table
	*/
220
	unsigned int embedNewCell(unsigned int orbit, Dart d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
221
222

	/**
untereiner's avatar
untereiner committed
223
	 * Copy the cell associated to a dart over an other dart
Pierre Kraemer's avatar
Pierre Kraemer committed
224
	 * @param orbit attribute orbit to use
untereiner's avatar
untereiner committed
225
226
	 * @param d the dart to overwrite (dest)
	 * @param e the dart to copy (src)
Pierre Kraemer's avatar
Pierre Kraemer committed
227
	 */
228
	void copyCell(unsigned int orbit, Dart d, Dart e) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
229
230
231
232
233
234
235

	/**
	 * 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
	 */
236
	void copyCell(unsigned int orbit, unsigned int i, unsigned int j) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
237
238
239
240
241
242

	/**
	 * Line of attributes i is initialized
	 * @param orbit attribute orbit to use
	 * @param i line to init
	 */
243
	void initCell(unsigned int orbit, unsigned int i) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
244
245
246
247
248
249

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

	/**
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
	AttributeContainer& getAttributeContainer(unsigned int orbit) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
254
255

	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
256
	 * get a multi vector of mark attribute (direct access with [i])
Pierre Kraemer's avatar
Pierre Kraemer committed
257
258
	 * @param orbit code
	 */
259
	AttributeMultiVector<Mark>* getMarkVector(unsigned int orbit, unsigned int thread = 0) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
260
261

	/**
262
263
	 * 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
264
	 */
265
	AttributeMultiVector<unsigned int>* getEmbeddingAttributeVector(unsigned int orbit) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
266
267

	/**
268
	 * swap two attribute containers
Pierre Kraemer's avatar
Pierre Kraemer committed
269
	 */
270
	void swapEmbeddingContainers(unsigned int orbit1, unsigned int orbit2) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
271
272
273
274
275
276
277

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

278
279
280
281
	/**
	 * Traverse the map and embed all orbits of the given dimension with a new cell
	 * @param realloc if true -> all the orbits are embedded on new cells, if false -> already embedded orbits are not impacted
	 */
282
	void initOrbitEmbedding(unsigned int orbit, bool realloc = false) ;
Sylvain Thery's avatar
Sylvain Thery committed
283

Sylvain Thery's avatar
Sylvain Thery committed
284
285
286
287
288
289
290
291
292
293
294
295
296
297
protected:
	/****************************************
	 *   EMBEDDING ATTRIBUTES MANAGEMENT    *
	 ****************************************/
	/**
	 * Create the dart attribute to store the embedding of this orbit (for internal use only)
	 */
	void addEmbedding(unsigned int orbit) ;

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

	/**
298
	 * Add a topological relation in the map
Sylvain Thery's avatar
Sylvain Thery committed
299
300
301
302
	 * @param name name of relation
	 */
	AttributeMultiVector<Dart>* addRelation(const std::string& name) ;

Sylvain Thery's avatar
Sylvain Thery committed
303
	/**
Pierre Kraemer's avatar
merges    
Pierre Kraemer committed
304
305
	 * Get AttributeMultivector pointer of a relation attribute
	 * @param name name of the relation
Sylvain Thery's avatar
Sylvain Thery committed
306
307
308
309
	 * @return the attribute multi-vector pointer
	 */
	AttributeMultiVector<Dart>* getRelation(const std::string& name);

Sylvain Thery's avatar
Sylvain Thery committed
310
	/****************************************
311
	 *          THREAD MANAGEMENT           *
Sylvain Thery's avatar
Sylvain Thery committed
312
313
314
315
316
317
318
	 ****************************************/
public:
	/**
	 * add  threads (a table of Marker per orbit for each thread)
	 * to allow MT
	 * @param nb thread to add
	 */
319
	void addThreadMarker(unsigned int nb) ;
Sylvain Thery's avatar
Sylvain Thery committed
320
321
322
323
324

	/**
	 * return allowed threads
	 * @return the number of threads (including principal)
	 */
325
	unsigned int getNbThreadMarkers() ;
Sylvain Thery's avatar
Sylvain Thery committed
326
327

	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
328
	 * Remove some added threads
Sylvain Thery's avatar
Sylvain Thery committed
329
330
	 * @return remaining number of threads (including principal)
	 */
331
	void removeThreadMarker(unsigned int nb) ;
Sylvain Thery's avatar
Sylvain Thery committed
332

Pierre Kraemer's avatar
Pierre Kraemer committed
333
334
335
336
337
338
339
340
341
342
	/****************************************
	 *             SAVE & LOAD              *
	 ****************************************/
public:
	/**
	 * check if an xml node has a given name
	 * @param node the xml node
	 * @param name the name
	 * @ return true if node has the good name
	 */
Sylvain Thery's avatar
Sylvain Thery committed
343
//	bool chechXmlNode(xmlNodePtr node, const std::string& name) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
344
345
346
347
348
349

	/**
	 * update the pointer of embedding vector after loading
	 */
	void update_m_emb_afterLoad();

Sylvain Thery's avatar
Sylvain Thery committed
350
351
352
353
354
	/**
	 * update the markTables and recursively from real type the topo shortcut pointers
	 */
	virtual void update_topo_shortcuts();

Pierre Kraemer's avatar
Pierre Kraemer committed
355
356
357
358
359
	/**
	 * Save map in a XML file
	 * @param filename the file name
	 * @return true if OK
	 */
Sylvain Thery's avatar
Sylvain Thery committed
360
//	bool saveMapXml(const std::string& filename, bool compress = false) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
361
362
363
364
365
366

	 /**
	 * Load map from a XML file
	 * @param filename the file name
	 * @return true if OK
	 */
Sylvain Thery's avatar
Sylvain Thery committed
367
//	bool loadMapXml(const std::string& filename, bool compress = false) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
368
369
370
371
372
373

	/**
	 * Save map in a binary file
	 * @param filename the file name
	 * @return true if OK
	 */
374
	bool saveMapBin(const std::string& filename) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
375
376
377
378
379
380

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

Sylvain Thery's avatar
Sylvain Thery committed
383
384
385
386
387
	/**
	 * Dump attributes types and names per orbit
	 */
	void dumpAttributesAndMarkers();

388
389
390
	/**
	 * update topo relation after compacting the container:
	 */
Pierre Kraemer's avatar
merges    
Pierre Kraemer committed
391
	virtual void compactTopoRelations(const std::vector<unsigned int>& oldnew) = 0;
392
393
394
395
396
397

	/**
	 * compact the map
	 */
	void compact();

Pierre Kraemer's avatar
Pierre Kraemer committed
398
399
400
401
402
403
404
405
	/****************************************
	 *           DARTS TRAVERSALS           *
	 ****************************************/

	/**
	 * Begin of map
	 * @return the first dart of the map
	 */
406
	Dart begin() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
407
408
409
410
411

	/**
	 * End of map
	 * @return the end iterator (next of last) of the map
	 */
412
	Dart end() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
413
414
415
416
417
418

	/**
	 * allow to go from a dart to the next
	 * in the order of storage
	 * @param d reference to the dart to be modified
	 */
419
	void next(Dart& d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
420
421
422
423
424

	/**
	 * Apply a functor on each dart of the map
	 * @param f a ref to the functor obj
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
425
	bool foreach_dart(FunctorType& f, const FunctorSelect& good = allDarts) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
426
427
428
429
430
431

	//! 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
	 */
432
	bool foreach_dart_of_orbit(unsigned int orbit, Dart d, FunctorType& f, unsigned int thread = 0) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
433

434
435
436
437
438
439
	virtual bool foreach_dart_of_vertex(Dart d, FunctorType& f, unsigned int thread = 0) = 0 ;
	virtual bool foreach_dart_of_edge(Dart d, FunctorType& f, unsigned int thread = 0) = 0 ;
	virtual bool foreach_dart_of_oriented_face(Dart d, FunctorType& f, unsigned int thread = 0) = 0 ;
	virtual bool foreach_dart_of_face(Dart d, FunctorType& f, unsigned int thread = 0) = 0 ;
	virtual bool foreach_dart_of_volume(Dart d, FunctorType& f, unsigned int thread = 0) = 0 ;
	virtual bool foreach_dart_of_cc(Dart d, FunctorType& f, unsigned int thread = 0) = 0 ;
Pierre Kraemer's avatar
Pierre Kraemer committed
440
441
442
443
444
445
446

	/**
	* execute functor for each orbit
	* @param dim the dimension of the orbit
	* @param f the functor
	* @param good the selector of darts
	*/
Pierre Kraemer's avatar
Pierre Kraemer committed
447
	bool foreach_orbit(unsigned int orbit, FunctorType& f, const FunctorSelect& good = allDarts, unsigned int thread = 0) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
448
449
450
451
452
453

	//! Count the number of orbits of dimension dim in the map
	/*! @param dim the dimension of the orbit
	 *	@param good the selector of darts
	 * 	@return the number of orbits
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
454
	unsigned int getNbOrbits(unsigned int orbit, const FunctorSelect& good = allDarts) ;
Sylvain Thery's avatar
Sylvain Thery committed
455
456
457
458
459

	/**
	 * print attributes name of map in std::cout (for debugging)
	 */
	void viewAttributesTables();
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474

protected:
	/// boundary marker
	Mark m_boundaryMarker;

	/**
	 * mark a dart as  belonging to boundary
	 */
	void boundaryMark(Dart d);

	/**
	 * unmark a dart from the boundary
	 */
	void boundaryUnmark(Dart d);

Pierre Kraemer's avatar
Pierre Kraemer committed
475
public:
476
477
478
479
480
	/**
	 * test if a dart belong to the boundary
	 */
	bool isBoundaryMarked(Dart d);

Pierre Kraemer's avatar
Pierre Kraemer committed
481
protected:
482
483
484
485
486
487
488
489
490
491
492
493
494
495
	/**
	 * mark an orbit of dart as belonging to boundary
	 */
	void boundaryMarkOrbit(unsigned int orbit, Dart d);

	/**
	 * unmark an orbit of dart from the boundary
	 */
	void boundaryUnmarkOrbit(unsigned int orbit, Dart d);

	/**
	 * clear all boundary markers
	 */
	void boundaryUnmarkAll();
Pierre Kraemer's avatar
Pierre Kraemer committed
496
497
} ;

498
499

template <typename MAP>
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
500
bool foreach_dart_of_orbit_in_parent(MAP* ptrMap, unsigned int orbit, Dart d, FunctorType& f, unsigned int thread = 0)
501
502
503
{
	switch(orbit)
	{
504
		case  DART: return f(d);
505
506
507
508
509
510
		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") ;
511
	}
512
	return false ;
513
514
515
}

template <typename MAP>
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
516
bool foreach_dart_of_orbit_in_parent2(MAP* ptrMap, unsigned int orbit, Dart d, FunctorType& f, unsigned int thread = 0)
517
518
519
{
	switch(orbit)
	{
520
		case  DART: return f(d);
521
522
523
524
525
526
		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") ;
527
	}
528
	return false ;
529
530
}

Pierre Kraemer's avatar
Pierre Kraemer committed
531
532
533
534
535
} //namespace CGoGN

#include "Topology/generic/genericmap.hpp"

#endif