genericmap.cpp 15.7 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
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#include "Topology/generic/genericmap.h"
26
#include "Topology/generic/attributeHandler.h"
27
#include "Topology/generic/traversor/traversorCell.h"
Sylvain Thery's avatar
Sylvain Thery committed
28

Pierre Kraemer's avatar
Pierre Kraemer committed
29 30
#include "Geometry/vector_gen.h"
#include "Geometry/matrix.h"
31
#include "Container/registered.h"
Pierre Kraemer's avatar
Pierre Kraemer committed
32 33 34

namespace CGoGN
{
35

Sylvain Thery's avatar
Sylvain Thery committed
36 37 38 39 40 41
namespace Parallel
{
//int NumberOfThreads=1;
int NumberOfThreads = getSystemNumberOfCores();
}

Pierre Kraemer's avatar
Pierre Kraemer committed
42
std::map<std::string, RegisteredBaseAttribute*>* GenericMap::m_attributes_registry_map = NULL;
43
int GenericMap::m_nbInstances = 0;
44

45
GenericMap::GenericMap() : m_nbThreads(1)
Pierre Kraemer's avatar
Pierre Kraemer committed
46
{
47
	if(m_attributes_registry_map == NULL)
Pierre Kraemer's avatar
Pierre Kraemer committed
48
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
49
		m_attributes_registry_map = new std::map<std::string, RegisteredBaseAttribute*>;
50

Pierre Kraemer's avatar
Pierre Kraemer committed
51 52 53
		// register all known types
		registerAttribute<Dart>("Dart");
		registerAttribute<Mark>("Mark");
Pierre Kraemer's avatar
Pierre Kraemer committed
54

Pierre Kraemer's avatar
Pierre Kraemer committed
55
		registerAttribute<char>("char");
56 57 58
		registerAttribute<short>("short");
		registerAttribute<int>("int");
		registerAttribute<long>("long");
Pierre Kraemer's avatar
Pierre Kraemer committed
59

Pierre Kraemer's avatar
Pierre Kraemer committed
60
		registerAttribute<unsigned char>("unsigned char");
61 62 63 64 65 66
		registerAttribute<unsigned short>("unsigned short");
		registerAttribute<unsigned int>("unsigned int");
		registerAttribute<unsigned long>("unsigned long");

		registerAttribute<float>("float");
		registerAttribute<double>("double");
Pierre Kraemer's avatar
Pierre Kraemer committed
67

Pierre Kraemer's avatar
Pierre Kraemer committed
68 69 70
		registerAttribute<Geom::Vec2f>(Geom::Vec2f::CGoGNnameOfType());
		registerAttribute<Geom::Vec3f>(Geom::Vec3f::CGoGNnameOfType());
		registerAttribute<Geom::Vec4f>(Geom::Vec4f::CGoGNnameOfType());
Pierre Kraemer's avatar
Pierre Kraemer committed
71

Pierre Kraemer's avatar
Pierre Kraemer committed
72 73 74
		registerAttribute<Geom::Vec2d>(Geom::Vec2d::CGoGNnameOfType());
		registerAttribute<Geom::Vec3d>(Geom::Vec3d::CGoGNnameOfType());
		registerAttribute<Geom::Vec4d>(Geom::Vec4d::CGoGNnameOfType());
Pierre Kraemer's avatar
Pierre Kraemer committed
75

Pierre Kraemer's avatar
Pierre Kraemer committed
76 77
		registerAttribute<Geom::Matrix33f>(Geom::Matrix33f::CGoGNnameOfType());
		registerAttribute<Geom::Matrix44f>(Geom::Matrix44f::CGoGNnameOfType());
Pierre Kraemer's avatar
Pierre Kraemer committed
78

Pierre Kraemer's avatar
Pierre Kraemer committed
79 80 81 82 83
		registerAttribute<Geom::Matrix33d>(Geom::Matrix33d::CGoGNnameOfType());
		registerAttribute<Geom::Matrix44d>(Geom::Matrix44d::CGoGNnameOfType());
	}

	m_nbInstances++;
Pierre Kraemer's avatar
Pierre Kraemer committed
84

85
	for(unsigned int i = 0; i < NB_ORBITS; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
86
	{
87
		m_attribs[i].setOrbit(i) ;
88
		m_attribs[i].setRegistry(m_attributes_registry_map) ;
89 90 91
		for(unsigned int j = 0; j < NB_THREAD; ++j)
		{
			m_marksets[i][j].clear() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
92
			m_markTables[i][j] = NULL ;
93
		}
Pierre Kraemer's avatar
Pierre Kraemer committed
94
	}
95

Pierre Kraemer's avatar
Pierre Kraemer committed
96 97
	init();

98
	for (unsigned int i = 0; i < NB_THREAD; ++i)
99 100 101 102
	{
		dartMarkers[i].reserve(16) ;
		cellMarkers[i].reserve(16) ;
	}
103

104
	// get & lock marker for boundary
Pierre Kraemer's avatar
Pierre Kraemer committed
105 106
	m_boundaryMarkers[0] = m_marksets[DART][0].getNewMark();
	m_boundaryMarkers[1] = m_marksets[DART][0].getNewMark();
Pierre Kraemer's avatar
Pierre Kraemer committed
107 108 109 110
}

GenericMap::~GenericMap()
{
111
	// release marker for boundary
Thery Sylvain's avatar
Thery Sylvain committed
112 113
	m_marksets[DART][0].releaseMark(m_boundaryMarkers[0]);
	m_marksets[DART][0].releaseMark(m_boundaryMarkers[1]);
114

Pierre Kraemer's avatar
Pierre Kraemer committed
115 116 117 118 119
	for(unsigned int i = 0; i < NB_ORBITS; ++i)
	{
		if(isOrbitEmbedded(i))
			m_attribs[i].clear(true) ;
	}
120 121 122 123 124

	for(std::multimap<AttributeMultiVectorGen*, AttributeHandlerGen*>::iterator it = attributeHandlers.begin(); it != attributeHandlers.end(); ++it)
		(*it).second->setInvalid() ;
	attributeHandlers.clear() ;

125
	for (unsigned int i = 0; i < NB_THREAD; ++i)
126 127 128 129
	{
		for(std::vector<DartMarkerGen*>::iterator it = dartMarkers[i].begin(); it != dartMarkers[i].end(); ++it)
			(*it)->setReleaseOnDestruct(false) ;
		dartMarkers[i].clear() ;
130

131 132 133 134
		for(std::vector<CellMarkerGen*>::iterator it = cellMarkers[i].begin(); it != cellMarkers[i].end(); ++it)
			(*it)->setReleaseOnDestruct(false) ;
		cellMarkers[i].clear() ;
	}
135 136 137

	// clean type registry if necessary
	m_nbInstances--;
Pierre Kraemer's avatar
Pierre Kraemer committed
138
	if (m_nbInstances <= 0)
139
	{
140 141 142
		for (std::map<std::string, RegisteredBaseAttribute*>::iterator it =  m_attributes_registry_map->begin(); it != m_attributes_registry_map->end(); ++it)
			delete it->second;

143
		delete m_attributes_registry_map;
144 145
		m_attributes_registry_map = NULL;
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
146 147
}

Pierre Kraemer's avatar
Pierre Kraemer committed
148
void GenericMap::init()
149
{
Pierre Kraemer's avatar
Pierre Kraemer committed
150
	for(unsigned int i = 0; i < NB_ORBITS; ++i)
151
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
152 153 154 155 156
		m_attribs[i].clear(true) ;
		m_embeddings[i] = NULL ;
		m_quickTraversal[i] = NULL;

		for(unsigned int j = 0; j < NB_ORBITS; ++j)
157
		{
Pierre Kraemer's avatar
Pierre Kraemer committed
158 159
			m_quickLocalIncidentTraversal[i][j] = NULL ;
			m_quickLocalAdjacentTraversal[i][j] = NULL ;
160
		}
Sylvain Thery's avatar
Sylvain Thery committed
161

Pierre Kraemer's avatar
Pierre Kraemer committed
162 163 164 165 166 167
		AttributeContainer& cont = m_attribs[i];
		for (unsigned int t = 0; t < m_nbThreads; ++t)
		{
			std::stringstream ss ;
			ss << "Mark_" << t ;
			AttributeMultiVector<Mark>* amvMark = cont.addAttribute<Mark>(ss.str()) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
168 169
//			for(unsigned int idx = cont.begin(); idx < cont.end(); cont.next(idx))
//				amvMark->operator[](idx).clear() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
			m_markTables[i][t] = amvMark ;
		}
	}

	for (unsigned int j = 0; j < NB_THREAD; ++j)
	{
		std::vector<CellMarkerGen*>& cmg = cellMarkers[j];
		for(unsigned int i = 0; i < cmg.size(); ++i)
		{
			CellMarkerGen* cm = cmg[i] ;
			cm->updateMarkVector(m_markTables[cm->getCell()][cm->getThread()]) ;
		}

		std::vector<DartMarkerGen*>& dmg = dartMarkers[j];
		for(unsigned int i = 0; i < dmg.size(); ++i)
		{
			DartMarkerGen* dm = dmg[i] ;
			dm->updateMarkVector(m_markTables[DART][dm->getThread()]) ;
		}
189
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
190 191 192 193 194 195 196 197 198 199

	for(std::multimap<AttributeMultiVectorGen*, AttributeHandlerGen*>::iterator it = attributeHandlers.begin(); it != attributeHandlers.end(); ++it)
		(*it).second->setInvalid() ;
	attributeHandlers.clear() ;
}

void GenericMap::clear(bool removeAttrib)
{
	if (removeAttrib)
		init();
Sylvain Thery's avatar
Sylvain Thery committed
200 201 202 203 204
	else
	{
		for(unsigned int i = 0; i < NB_ORBITS; ++i)
			m_attribs[i].clear(false) ;
	}
untereiner's avatar
untereiner committed
205 206
}

Pierre Kraemer's avatar
Pierre Kraemer committed
207 208 209 210
/****************************************
 *        ATTRIBUTES MANAGEMENT         *
 ****************************************/

untereiner's avatar
untereiner committed
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
void GenericMap::swapEmbeddingContainers(unsigned int orbit1, unsigned int orbit2)
{
	assert(orbit1 != orbit2 || !"Cannot swap a container with itself") ;
	assert((orbit1 != DART && orbit2 != DART) || !"Cannot swap the darts container") ;

	m_attribs[orbit1].swap(m_attribs[orbit2]) ;
	m_attribs[orbit1].setOrbit(orbit1) ;	// to update the orbit information
	m_attribs[orbit2].setOrbit(orbit2) ;	// in the contained AttributeMultiVectors

	m_embeddings[orbit1]->swap(m_embeddings[orbit2]) ;

	for(unsigned int t = 0; t < m_nbThreads; ++t)
	{
		AttributeMultiVector<Mark>* m = m_markTables[orbit1][t] ;
		m_markTables[orbit1][t] = m_markTables[orbit2][t] ;
		m_markTables[orbit2][t] = m ;

		MarkSet ms = m_marksets[orbit1][t] ;
		m_marksets[orbit1][t] = m_marksets[orbit2][t] ;
		m_marksets[orbit2][t] = ms ;
	}

Pierre Kraemer's avatar
Pierre Kraemer committed
233
	for (unsigned int i = 0; i < NB_THREAD; ++i)
untereiner's avatar
untereiner committed
234 235 236 237 238 239 240 241 242 243
	{
		for(std::vector<CellMarkerGen*>::iterator it = cellMarkers[i].begin(); it != cellMarkers[i].end(); ++it)
		{
			if((*it)->m_cell == orbit1)
				(*it)->m_cell = orbit2 ;
			else if((*it)->m_cell == orbit2)
				(*it)->m_cell = orbit1 ;
		}
	}
}
Pierre Kraemer's avatar
Pierre Kraemer committed
244

Pierre Kraemer's avatar
Pierre Kraemer committed
245 246 247 248 249 250 251 252 253 254 255 256
void GenericMap::viewAttributesTables()
{
	std::cout << "======================="<< std::endl ;
	for (unsigned int i = 0; i < NB_ORBITS; ++i)
	{
		std::cout << "ATTRIBUTE_CONTAINER " << i << std::endl ;
		AttributeContainer& cont = m_attribs[i] ;

		// get the list of attributes
		std::vector<std::string> listeNames ;
		cont.getAttributesNames(listeNames) ;
		for (std::vector<std::string>::iterator it = listeNames.begin(); it != listeNames.end(); ++it)
257 258 259 260 261
		{
			unsigned int id = cont.getAttributeIndex(*it);
			std::cout << "    " << *it << " ("<<id<<")"<<std::endl ;
		}

Pierre Kraemer's avatar
Pierre Kraemer committed
262 263 264 265 266 267 268 269 270 271 272 273 274
		std::cout << "-------------------------" << std::endl ;
	}
	std::cout << "m_embeddings: " << std::hex ;
	for (unsigned int i = 0; i < NB_ORBITS; ++i)
		std::cout << (long)(m_embeddings[i]) << " / " ;
	std::cout << std::endl << "-------------------------" << std::endl ;

	std::cout << "m_markTables: " ;
	for (unsigned int i = 0; i < NB_ORBITS; ++i)
		std::cout << (long)(m_markTables[i][0]) << " / " ;
	std::cout << std::endl << "-------------------------" << std::endl << std::dec ;
}

275 276 277 278 279 280 281
void GenericMap::printDartsTable()
{
	std::cout << "======================="<< std::endl ;

	//m_attribs[DART]
}

282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
/****************************************
 *          THREAD MANAGEMENT           *
 ****************************************/

void GenericMap::addThreadMarker(unsigned int nb)
{
	unsigned int th ;

	for (unsigned int j = 0; j < nb; ++j)
	{
		th = m_nbThreads ;
		m_nbThreads++ ;

		for (unsigned int i = 0; i < NB_ORBITS; ++i)
		{
297 298 299 300 301
			std::stringstream ss ;
			ss << "Mark_"<< th ;
			AttributeContainer& cellCont = m_attribs[i] ;
			AttributeMultiVector<Mark>* amvMark = cellCont.addAttribute<Mark>(ss.str()) ;
			m_markTables[i][th] = amvMark ;
302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
		}
	}
}

unsigned int GenericMap::getNbThreadMarkers()
{
	return m_nbThreads;
}

void GenericMap::removeThreadMarker(unsigned int nb)
{
	unsigned int th = 0;
	while ((m_nbThreads > 1) && (nb > 0))
	{
		th = --m_nbThreads ;
		--nb;
		for (unsigned int i = 0; i < NB_ORBITS; ++i)
		{
320 321 322 323 324
			std::stringstream ss ;
			ss << "Mark_"<< th ;
			AttributeContainer& cellCont = m_attribs[i] ;
			cellCont.removeAttribute<Mark>(ss.str()) ;
			m_markTables[i][th] = NULL ;
325 326 327
		}
	}
}
Pierre Kraemer's avatar
Pierre Kraemer committed
328 329 330 331 332

/****************************************
 *             SAVE & LOAD              *
 ****************************************/

Pierre Kraemer's avatar
Pierre Kraemer committed
333
void GenericMap::restore_shortcuts()
Sylvain Thery's avatar
Sylvain Thery committed
334
{
335 336 337 338 339 340 341 342 343 344 345
	// NB THREADS

	std::vector<std::string> typeMark;
	unsigned int nbatt0 = m_attribs[0].getAttributesTypes(typeMark);
	m_nbThreads = 0;
	for (unsigned int i = 0; i < nbatt0; ++i)
	{
		if (typeMark[i] == "Mark")
			++m_nbThreads;
	}

Pierre Kraemer's avatar
Pierre Kraemer committed
346 347
	// EMBEDDING

Sylvain Thery's avatar
Sylvain Thery committed
348 349 350 351 352 353 354 355 356 357
	// get container of dart orbit
	AttributeContainer& cont = m_attribs[DART] ;

	// get the list of attributes
	std::vector<std::string> listeNames;
	cont.getAttributesNames(listeNames);

	// check if there are EMB_X attributes
	for (unsigned int i = 0;  i < listeNames.size(); ++i)
	{
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
358
		std::string sub = listeNames[i].substr(0, listeNames[i].size() - 1);
Sylvain Thery's avatar
Sylvain Thery committed
359 360 361 362 363 364 365 366
		if (sub == "EMB_")
		{
			unsigned int orb = listeNames[i][4]-'0'; // easy atoi computation for one char;
			AttributeMultiVector<unsigned int>* amv = cont.getDataVector<unsigned int>(i);
			m_embeddings[orb] = amv ;
		}
	}

Pierre Kraemer's avatar
Pierre Kraemer committed
367 368
	// MARKERS & QUICK TRAVERSAL

Sylvain Thery's avatar
Sylvain Thery committed
369 370 371 372
	for(unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit)
	{
		AttributeContainer& cont = m_attribs[orbit];

Pierre Kraemer's avatar
Pierre Kraemer committed
373 374 375 376 377 378 379 380 381
		// QUICK TRAVERSAL

		m_quickTraversal[orbit] = cont.getDataVector<Dart>("quick_traversal") ;
		for(unsigned int j = 0; j < NB_ORBITS; ++j)
		{
			std::stringstream ss;
			ss << "quickLocalIncidentTraversal_" << j;
			m_quickLocalIncidentTraversal[orbit][j] = cont.getDataVector< NoTypeNameAttribute<std::vector<Dart> > >(ss.str()) ;
			std::stringstream ss2;
Pierre Kraemer's avatar
Pierre Kraemer committed
382
			ss2 << "quickLocalAdjacentTraversal_" << j;
Pierre Kraemer's avatar
Pierre Kraemer committed
383 384 385 386 387
			m_quickLocalAdjacentTraversal[orbit][j] = cont.getDataVector< NoTypeNameAttribute<std::vector<Dart> > >(ss2.str()) ;
		}

		// MARKERS

Sylvain Thery's avatar
Sylvain Thery committed
388 389 390 391 392
		std::vector<std::string> listeNames;
		cont.getAttributesNames(listeNames);

		for (unsigned int i = 0;  i < listeNames.size(); ++i)
		{
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
393
			std::string sub = listeNames[i].substr(0, 5);
Sylvain Thery's avatar
Sylvain Thery committed
394 395 396
			if (sub == "Mark_")
			{
				// get thread number
Pierre Kraemer's avatar
Pierre Kraemer committed
397
				unsigned int thread = listeNames[i][5] - '0';
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
398
				if (listeNames[i].size() > 6) 					// thread number is >9
Pierre Kraemer's avatar
Pierre Kraemer committed
399
					thread = 10 * thread + (listeNames[i][6] - '0');
Sylvain Thery's avatar
Sylvain Thery committed
400 401 402 403

				AttributeMultiVector<Mark>* amvMark = cont.getDataVector<Mark>(i);
				m_markTables[orbit][thread] = amvMark ;

404 405
				if ((orbit == DART) && (thread == 0))	// for Dart Marker of thread O
				{										// clear all marks expect boundary marks
Pierre Kraemer's avatar
Pierre Kraemer committed
406
					Mark m(m_boundaryMarkers[0] + m_boundaryMarkers[1]);
Sylvain Thery's avatar
Sylvain Thery committed
407
					m.invert();
408 409
					for (unsigned int k = cont.begin(); k != cont.end(); cont.next(k))
						amvMark->operator[](k).unsetMark(m);
Sylvain Thery's avatar
Sylvain Thery committed
410
				}
411
				else									// for others clear all
Sylvain Thery's avatar
Sylvain Thery committed
412
				{
413 414
					for (unsigned int k = cont.begin(); k != cont.end(); cont.next(k))
						amvMark->operator[](k).clear();
Sylvain Thery's avatar
Sylvain Thery committed
415 416 417 418
				}
			}
		}
	}
419

420
	// restore mark vectors in Dart & Cell Markers
421 422 423 424
	for (unsigned int j = 0; j < NB_THREAD; ++j)
	{
		for (std::vector<DartMarkerGen*>::iterator it = dartMarkers[j].begin(); it != dartMarkers[j].end(); ++it)
			(*it)->updateMarkVector(m_markTables[DART][(*it)->getThread()]);
425

426 427 428
		for (std::vector<CellMarkerGen*>::iterator it = cellMarkers[j].begin(); it != cellMarkers[j].end(); ++it)
			(*it)->updateMarkVector(m_markTables[(*it)->getCell()][(*it)->getThread()]);
	}
429

430 431 432 433
	// set Attribute handlers invalid
	for(std::multimap<AttributeMultiVectorGen*, AttributeHandlerGen*>::iterator it = attributeHandlers.begin(); it != attributeHandlers.end(); ++it)
		(*it).second->setInvalid() ;
	attributeHandlers.clear() ;
Sylvain Thery's avatar
Sylvain Thery committed
434 435 436 437
}

void GenericMap::dumpAttributesAndMarkers()
{
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
438
	for (unsigned int i = 0; i < NB_ORBITS; ++i)
Sylvain Thery's avatar
Sylvain Thery committed
439 440
	{
		std::vector<std::string> names;
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
441
		names.reserve(32); 				//just to limit reallocation
Sylvain Thery's avatar
Sylvain Thery committed
442 443
		m_attribs[i].getAttributesNames(names);
		unsigned int nb = names.size();
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
444
		if (nb > 0)
Sylvain Thery's avatar
Sylvain Thery committed
445
		{
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
446
			CGoGNout << "ORBIT "<< i << CGoGNendl;
Sylvain Thery's avatar
Sylvain Thery committed
447 448 449
			std::vector<std::string> types;
			types.reserve(nb);
			m_attribs[i].getAttributesTypes(types);
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
450 451
			for (unsigned int j = 0; j < nb; ++j)
				CGoGNout << "    " << j << " : " << types[j] << " " << names[j] << CGoGNendl;
Sylvain Thery's avatar
Sylvain Thery committed
452 453 454
		}
	}
	CGoGNout << "RESERVED MARKERS "<< CGoGNendl;
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
455
	for (unsigned int i = 0; i < NB_ORBITS; ++i)
Sylvain Thery's avatar
Sylvain Thery committed
456
	{
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
457
		for (unsigned int j = 0; j < NB_THREAD; ++j)
Sylvain Thery's avatar
Sylvain Thery committed
458 459 460 461
		{
			MarkSet ms = m_marksets[i][j];
			if (!ms.isClear())
			{
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
462
				CGoGNout << "Orbit " << i << "  thread " << j << " : ";
Sylvain Thery's avatar
Sylvain Thery committed
463
				Mark m(1);
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
464
				for (unsigned i = 0; i < Mark::getNbMarks(); ++i)
Sylvain Thery's avatar
Sylvain Thery committed
465 466
				{
					if (ms.testMark(m))
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
467
						CGoGNout << m.getMarkVal() << ", ";
Sylvain Thery's avatar
Sylvain Thery committed
468 469 470 471 472 473 474 475
					m.setMarkVal(m.getMarkVal()<<1);
				}
				CGoGNout << CGoGNendl;
			}
		}
	}
}

476 477
void GenericMap::compact()
{
478 479 480
	// compact embedding attribs
	std::vector< std::vector<unsigned int>* > oldnews;
	oldnews.resize(NB_ORBITS);
481 482 483 484
	for (unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit)
	{
		if ((orbit != DART) && (isOrbitEmbedded(orbit)))
		{
485 486 487 488
			oldnews[orbit] = new std::vector<unsigned int>;
			m_attribs[orbit].compact(*(oldnews[orbit]));
		}
	}
489

490 491 492 493 494 495
	// update embedding indices of topo
	for (unsigned int i = m_attribs[DART].begin(); i != m_attribs[DART].end(); m_attribs[DART].next(i))
	{
		for (unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit)
		{
			if ((orbit != DART) && (isOrbitEmbedded(orbit)))
496
			{
497 498
				unsigned int& idx = m_embeddings[orbit]->operator[](i);
				unsigned int jdx = oldnews[orbit]->operator[](idx);
Pierre Kraemer's avatar
merges  
Pierre Kraemer committed
499
				if ((jdx != 0xffffffff) && (jdx != idx))
500 501 502 503
					idx = jdx;
			}
		}
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
504

505 506 507 508 509
	// delete allocated vectors
	for (unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit)
		if ((orbit != DART) && (isOrbitEmbedded(orbit)))
			delete[] oldnews[orbit];

510 511
	// compact topo (depends on map implementation)
	compactTopo();
512 513
}

Pierre Kraemer's avatar
Pierre Kraemer committed
514
} // namespace CGoGN