genericmap.h 20.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-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"
Pierre Kraemer's avatar
Pierre Kraemer committed
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<unsigned int CELL> class CellMarkerBase ;
54

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

protected:
68

Pierre Kraemer's avatar
Pierre Kraemer committed
69 70 71
	/**
	 * Attributes Containers
	 */
72
	AttributeContainer m_attribs[NB_ORBITS] ;
Pierre Kraemer's avatar
Pierre Kraemer committed
73

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

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

Pierre Kraemer's avatar
Pierre Kraemer committed
83 84 85 86 87
	/**
	 * Direct access to quick traversal attributes
	 * (initialized by enableQuickTraversal function)
	 */
	AttributeMultiVector<Dart>* m_quickTraversal[NB_ORBITS] ;
Sylvain Thery's avatar
Sylvain Thery committed
88 89 90
	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
91
	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
92
	 * Marks manager
Pierre Kraemer's avatar
Pierre Kraemer committed
93
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
94
	MarkSet m_marksets[NB_ORBITS][NB_THREAD] ;
Pierre Kraemer's avatar
Pierre Kraemer committed
95 96 97 98

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

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

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

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

112

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]
Pierre Kraemer's avatar
Pierre Kraemer committed
159 160 161
	 */
	void deleteDartLine(unsigned int index) ;

Pierre Kraemer's avatar
Pierre Kraemer committed
162
public:
163
	/**
164 165 166
	 * @brief dartIndex
	 * @param d
	 * @return index of dart (depends on map implementation)
Pierre Kraemer's avatar
Pierre Kraemer committed
167
	 */
168
	virtual unsigned int dartIndex(Dart d) const ;
Pierre Kraemer's avatar
Pierre Kraemer committed
169 170 171 172

	/**
	 * @return the number of darts in the map
	 */
173
	virtual unsigned int getNbDarts() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
174

Pierre Kraemer's avatar
Pierre Kraemer committed
175 176 177 178 179
	/**
	 * return true if the dart d refers to a valid index
	 */
	bool isDartValid(Dart d) ;

Pierre Kraemer's avatar
Pierre Kraemer committed
180 181 182 183 184 185 186
	/****************************************
	 *         EMBEDDING MANAGEMENT         *
	 ****************************************/

	/**
	 * tell if an orbit is embedded or not
	 */
187 188
	template <unsigned int ORBIT>
	bool isOrbitEmbedded() const ;
Pierre Kraemer's avatar
Pierre Kraemer committed
189

190
	bool isOrbitEmbedded(unsigned int orbit) const ;
Pierre Kraemer's avatar
Pierre Kraemer committed
191 192 193 194 195

	/**
	 * get the cell index of the given dimension associated to dart d
	 * @return EMBNULL if the orbit of d is not attached to any cell
	 */
196
	template<unsigned int ORBIT>
Sylvain Thery's avatar
Sylvain Thery committed
197
	unsigned int getEmbedding(Dart d) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
198 199 200 201

	/**
	 * Set the cell index of the given dimension associated to dart d
	 */
202 203
	template <unsigned int ORBIT>
	void setDartEmbedding(Dart d, unsigned int emb) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
204

205 206 207 208 209 210 211
	/**
	 * Set the cell index of the given dimension associated to dart d
	 * !!! WARNING !!! use only on freshly inserted darts (no unref is done on old embedding) !!! WARNING !!!
	 */
	template <unsigned int ORBIT>
	void initDartEmbedding(Dart d, unsigned int emb) ;

Pierre Kraemer's avatar
Pierre Kraemer committed
212 213 214
	/**
	 * Copy the index of the cell associated to a dart over an other dart
	 * @param orbit the id of orbit embedding
Pierre Kraemer's avatar
Pierre Kraemer committed
215 216
	 * @param dest the dart to overwrite
	 * @param src the dart to copy
Pierre Kraemer's avatar
Pierre Kraemer committed
217
	 */
218 219
	template <unsigned int ORBIT>
	void copyDartEmbedding(Dart dest, Dart src) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
220 221 222 223 224 225

	/**
	 * Allocation of some place in attrib table
	 * @param orbit the orbit of embedding
	 * @return the index to use as embedding
	 */
226 227
	template <unsigned int ORBIT>
	unsigned int newCell() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
228 229 230 231 232 233 234

	/**
	* 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
	*/
235
	template <unsigned int ORBIT>
236 237 238 239 240 241 242 243
	void setOrbitEmbedding(Dart d, unsigned int em) ;

	/**
	 * Set the index of the associated cell to all the darts of an orbit
	 * !!! WARNING !!! use only on freshly inserted darts (no unref is done on old embedding)!!! WARNING !!!
	 */
	template <unsigned int ORBIT>
	void initOrbitEmbedding(Dart d, unsigned int em) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
244 245

	/**
246
	* Associate an new cell to all darts of an orbit
Pierre Kraemer's avatar
Pierre Kraemer committed
247 248 249 250
	* @param orbit orbit to embed
	* @param d a dart of the topological cell
	* @return index of the attribute in table
	*/
251
	template <unsigned int ORBIT>
252
	unsigned int setOrbitEmbeddingOnNewCell(Dart d) ;
253 254 255 256 257 258 259

	/**
	 * Associate an new cell to all darts of an orbit
	 * !!! WARNING !!! use only on freshly inserted darts (no unref is done on old embedding)!!! WARNING !!!
	 */
	template <unsigned int ORBIT>
	unsigned int initOrbitEmbeddingNewCell(Dart d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
260 261

	/**
untereiner's avatar
untereiner committed
262
	 * Copy the cell associated to a dart over an other dart
Pierre Kraemer's avatar
Pierre Kraemer committed
263
	 * @param orbit attribute orbit to use
untereiner's avatar
untereiner committed
264 265
	 * @param d the dart to overwrite (dest)
	 * @param e the dart to copy (src)
Pierre Kraemer's avatar
Pierre Kraemer committed
266
	 */
267 268
	template <unsigned int ORBIT>
	void copyCell(Dart d, Dart e) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
269 270 271 272 273 274 275

	/**
	 * 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
	 */
276 277
	template <unsigned int ORBIT>
	void copyCell(unsigned int i, unsigned int j) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
278 279 280 281 282 283

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

287 288 289 290 291 292 293
	/**
	 * 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
	 */
	template <unsigned int ORBIT>
	void initAllOrbitsEmbedding(bool realloc = false) ;

Pierre Kraemer's avatar
Pierre Kraemer committed
294 295 296 297 298 299 300 301
	/****************************************
	 *     QUICK TRAVERSAL MANAGEMENT       *
	 ****************************************/

	template <unsigned int ORBIT>
	void enableQuickTraversal() ;

	template <unsigned int ORBIT>
302
	void updateQuickTraversal() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
303 304

	template <unsigned int ORBIT>
Sylvain Thery's avatar
Sylvain Thery committed
305
	const AttributeMultiVector<Dart>* getQuickTraversal() const;
Pierre Kraemer's avatar
Pierre Kraemer committed
306 307 308 309

	template <unsigned int ORBIT>
	void disableQuickTraversal() ;

Sylvain Thery's avatar
Sylvain Thery committed
310 311

	template <typename MAP, unsigned int ORBIT, unsigned int INCI>
Sylvain Thery's avatar
Sylvain Thery committed
312
	void enableQuickIncidentTraversal();
Sylvain Thery's avatar
Sylvain Thery committed
313 314

	template <typename MAP, unsigned int ORBIT, unsigned int INCI>
Sylvain Thery's avatar
Sylvain Thery committed
315
	void updateQuickIncidentTraversal();
Sylvain Thery's avatar
Sylvain Thery committed
316 317

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

	template <unsigned int ORBIT, unsigned int INCI>
Sylvain Thery's avatar
Sylvain Thery committed
321
	void disableQuickIncidentTraversal();
Sylvain Thery's avatar
Sylvain Thery committed
322 323

	template <typename MAP, unsigned int ORBIT, unsigned int ADJ>
Sylvain Thery's avatar
Sylvain Thery committed
324
	void enableQuickAdjacentTraversal();
Sylvain Thery's avatar
Sylvain Thery committed
325 326

	template <typename MAP, unsigned int ORBIT, unsigned int ADJ>
Sylvain Thery's avatar
Sylvain Thery committed
327
	void updateQuickAdjacentTraversal();
Sylvain Thery's avatar
Sylvain Thery committed
328 329

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

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

Pierre Kraemer's avatar
Pierre Kraemer committed
335 336 337 338
	/****************************************
	 *        ATTRIBUTES MANAGEMENT         *
	 ****************************************/

339 340 341 342 343 344
	/**
	 * 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
345
	/**
346 347
	 * get the attrib container of a given orbit
	 * @param orbit the orbit !!! (bilbo the orbit !)
Pierre Kraemer's avatar
Pierre Kraemer committed
348
	 */
349 350
	template <unsigned int ORBIT>
	AttributeContainer& getAttributeContainer() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
351

Sylvain Thery's avatar
Sylvain Thery committed
352 353 354
	template <unsigned int ORBIT>
	const AttributeContainer& getAttributeContainer() const;

Pierre Kraemer's avatar
Pierre Kraemer committed
355 356
	AttributeContainer& getAttributeContainer(unsigned int orbit) ;

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

Pierre Kraemer's avatar
Pierre Kraemer committed
359
	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
360
	 * get a multi vector of mark attribute (direct access with [i])
Pierre Kraemer's avatar
Pierre Kraemer committed
361
	 */
362 363
	template <unsigned int ORBIT>
	AttributeMultiVector<Mark>* getMarkVector(unsigned int thread = 0) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
364 365

	/**
366 367
	 * 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
368
	 */
369 370
	template <unsigned int ORBIT>
	AttributeMultiVector<unsigned int>* getEmbeddingAttributeVector() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
371

untereiner's avatar
untereiner committed
372 373 374 375
	/**
	 * swap two attribute containers
	 */
	void swapEmbeddingContainers(unsigned int orbit1, unsigned int orbit2) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
376 377 378 379 380 381 382

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

Pierre Kraemer's avatar
Pierre Kraemer committed
383 384 385 386 387
	/**
	 * print attributes name of map in std::cout (for debugging)
	 */
	void viewAttributesTables() ;

388 389
	void printDartsTable();

Sylvain Thery's avatar
Sylvain Thery committed
390 391 392 393 394 395 396
protected:
	/****************************************
	 *   EMBEDDING ATTRIBUTES MANAGEMENT    *
	 ****************************************/
	/**
	 * Create the dart attribute to store the embedding of this orbit (for internal use only)
	 */
397 398
	template <unsigned int ORBIT>
	void addEmbedding() ;
Sylvain Thery's avatar
Sylvain Thery committed
399 400 401 402 403 404

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

	/**
405
	 * Add a topological relation in the map
Sylvain Thery's avatar
Sylvain Thery committed
406 407 408 409
	 * @param name name of relation
	 */
	AttributeMultiVector<Dart>* addRelation(const std::string& name) ;

Sylvain Thery's avatar
Sylvain Thery committed
410
	/**
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
411 412
	 * Get AttributeMultivector pointer of a relation attribute
	 * @param name name of the relation
Sylvain Thery's avatar
Sylvain Thery committed
413 414
	 * @return the attribute multi-vector pointer
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
415
	AttributeMultiVector<Dart>* getRelation(const std::string& name) ;
Sylvain Thery's avatar
Sylvain Thery committed
416

Sylvain Thery's avatar
Sylvain Thery committed
417
	/****************************************
418
	 *          THREAD MANAGEMENT           *
Sylvain Thery's avatar
Sylvain Thery committed
419 420 421 422 423 424 425
	 ****************************************/
public:
	/**
	 * add  threads (a table of Marker per orbit for each thread)
	 * to allow MT
	 * @param nb thread to add
	 */
426
	void addThreadMarker(unsigned int nb) ;
Sylvain Thery's avatar
Sylvain Thery committed
427 428 429 430 431

	/**
	 * return allowed threads
	 * @return the number of threads (including principal)
	 */
432
	unsigned int getNbThreadMarkers() ;
Sylvain Thery's avatar
Sylvain Thery committed
433 434

	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
435
	 * Remove some added threads
Sylvain Thery's avatar
Sylvain Thery committed
436 437
	 * @return remaining number of threads (including principal)
	 */
438
	void removeThreadMarker(unsigned int nb) ;
Sylvain Thery's avatar
Sylvain Thery committed
439

Pierre Kraemer's avatar
Pierre Kraemer committed
440 441 442 443 444 445 446 447 448 449
	/****************************************
	 *             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
450
//	bool chechXmlNode(xmlNodePtr node, const std::string& name) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
451 452 453 454 455 456

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

Sylvain Thery's avatar
Sylvain Thery committed
457 458 459 460 461
	/**
	 * update the markTables and recursively from real type the topo shortcut pointers
	 */
	virtual void update_topo_shortcuts();

Pierre Kraemer's avatar
Pierre Kraemer committed
462 463 464 465 466
	/**
	 * Save map in a XML file
	 * @param filename the file name
	 * @return true if OK
	 */
Sylvain Thery's avatar
Sylvain Thery committed
467
//	bool saveMapXml(const std::string& filename, bool compress = false) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
468 469 470 471 472 473

	 /**
	 * Load map from a XML file
	 * @param filename the file name
	 * @return true if OK
	 */
Sylvain Thery's avatar
Sylvain Thery committed
474
//	bool loadMapXml(const std::string& filename, bool compress = false) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
475 476 477 478 479 480

	/**
	 * Save map in a binary file
	 * @param filename the file name
	 * @return true if OK
	 */
Sylvain Thery's avatar
Sylvain Thery committed
481
	bool saveMapBin(const std::string& filename) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
482 483 484 485 486 487

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

490 491 492
	/**
	 * copy from another map (of same type)
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
493
	bool copyFrom(const GenericMap& map) ;
494

Sylvain Thery's avatar
Sylvain Thery committed
495 496 497
	/**
	 * Dump attributes types and names per orbit
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
498
	void dumpAttributesAndMarkers() ;
Sylvain Thery's avatar
Sylvain Thery committed
499

500 501 502
	/**
	 * update topo relation after compacting the container:
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
503
	virtual void compactTopoRelations(const std::vector<unsigned int>& oldnew) = 0 ;
504 505 506 507

	/**
	 * compact the map
	 */
Pierre Kraemer's avatar
Pierre Kraemer committed
508
	void compact() ;
509

Pierre Kraemer's avatar
Pierre Kraemer committed
510 511 512 513
	/****************************************
	 *           DARTS TRAVERSALS           *
	 ****************************************/

514 515 516 517 518
//	/**
//	 * 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
519

520 521 522
	virtual Dart begin() const;
	virtual Dart end() const;
	virtual void next(Dart& d) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
523 524 525 526 527 528

	//! 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
	 */
529
	template <unsigned int ORBIT>
Sylvain Thery's avatar
Sylvain Thery committed
530 531 532 533 534 535 536 537
	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
538

Sylvain Thery's avatar
Sylvain Thery committed
539 540
	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; }
541

Sylvain Thery's avatar
Sylvain Thery committed
542 543 544 545
	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; }

Pierre Kraemer's avatar
Pierre Kraemer committed
546 547 548 549 550
	/**
	* execute functor for each orbit
	* @param dim the dimension of the orbit
	* @param f the functor
	*/
551
	template <typename MAP, unsigned int ORBIT>
Sylvain Thery's avatar
Sylvain Thery committed
552 553
	bool foreach_orbit(FunctorType& f, unsigned int thread = 0) const;

Pierre Kraemer's avatar
Pierre Kraemer committed
554 555 556 557 558

	//! Count the number of orbits of dimension dim in the map
	/*! @param dim the dimension of the orbit
	 * 	@return the number of orbits
	 */
559
	template <typename MAP, unsigned int ORBIT>
Sylvain Thery's avatar
Sylvain Thery committed
560
	unsigned int getNbOrbits() const;
Sylvain Thery's avatar
Sylvain Thery committed
561

562 563 564
	//! For an orbit of a given dimension, return the number of incident cells of an other given dimension
	/*! @param d a dart
	 */
565
	template <typename MAP, unsigned int ORBIT, unsigned int INCIDENT>
Sylvain Thery's avatar
Sylvain Thery committed
566
	unsigned int degree(Dart d) const;
567

568 569 570 571
	/****************************************
	 *         BOUNDARY MANAGEMENT          *
	 ****************************************/

572
protected:
Thery Sylvain's avatar
Thery Sylvain committed
573 574
	/// boundary markers
	Mark m_boundaryMarkers[2] ; // 0 for dim 2 / 1 for dim 3
575 576 577 578

	/**
	 * mark a dart as  belonging to boundary
	 */
Thery Sylvain's avatar
Thery Sylvain committed
579
	template <unsigned int D>
Pierre Kraemer's avatar
Pierre Kraemer committed
580
	void boundaryMark(Dart d) ;
Thery Sylvain's avatar
Thery Sylvain committed
581 582
	void boundaryMark2(Dart d) ;
	void boundaryMark3(Dart d) ;
583 584 585 586

	/**
	 * unmark a dart from the boundary
	 */
Thery Sylvain's avatar
Thery Sylvain committed
587
	template <unsigned int D>
Pierre Kraemer's avatar
Pierre Kraemer committed
588
	void boundaryUnmark(Dart d) ;
Thery Sylvain's avatar
Thery Sylvain committed
589 590
	void boundaryUnmark2(Dart d) ;
	void boundaryUnmark3(Dart d) ;
591

Pierre Kraemer's avatar
Pierre Kraemer committed
592
public:
593 594 595
	/**
	 * test if a dart belong to the boundary
	 */
Thery Sylvain's avatar
Thery Sylvain committed
596
	template <unsigned int D>
Pierre Kraemer's avatar
Pierre Kraemer committed
597
	bool isBoundaryMarked(Dart d) const ;
598

Thery Sylvain's avatar
Thery Sylvain committed
599 600
	bool isBoundaryMarked2(Dart d) const ;
	bool isBoundaryMarked3(Dart d) const ;
601
	bool isBoundaryMarkedCurrent(Dart d) const ;
Thery Sylvain's avatar
Thery Sylvain committed
602

Pierre Kraemer's avatar
Pierre Kraemer committed
603
protected:
604 605 606
	/**
	 * mark an orbit of dart as belonging to boundary
	 */
Thery Sylvain's avatar
Thery Sylvain committed
607
	template <unsigned int ORBIT, unsigned int DIM>
608
	void boundaryMarkOrbit(Dart d) ;
609 610 611 612

	/**
	 * unmark an orbit of dart from the boundary
	 */
Thery Sylvain's avatar
Thery Sylvain committed
613
	template <unsigned int ORBIT, unsigned int DIM>
614
	void boundaryUnmarkOrbit(Dart d) ;
615 616 617 618

	/**
	 * clear all boundary markers
	 */
Thery Sylvain's avatar
Thery Sylvain committed
619
	template<unsigned int DIM>
Pierre Kraemer's avatar
Pierre Kraemer committed
620
	void boundaryUnmarkAll() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
621 622
} ;

623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654
//
//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 ;
//}
655

Pierre Kraemer's avatar
Pierre Kraemer committed
656 657 658 659 660
} //namespace CGoGN

#include "Topology/generic/genericmap.hpp"

#endif