Coupure prévue mardi 3 Août au matin pour maintenance du serveur. Nous faisons au mieux pour que celle-ci soit la plus brève possible.

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

namespace CGoGN
{
Pierre Kraemer's avatar
Pierre Kraemer committed
27

28
29
30
31
32
33
34
35
36
37
38
39
40
41
/****************************************
 *           MULTIRES                   *
 ****************************************/

inline unsigned int GenericMap::getCurrentLevel()
{
	return m_mrCurrentLevel ;
}

inline void GenericMap::setCurrentLevel(unsigned int l)
{
	if(l < m_mrDarts.size())
		m_mrCurrentLevel = l ;
	else
Pierre Kraemer's avatar
Pierre Kraemer committed
42
		CGoGNout << "setCurrentLevel : try to access nonexistent resolution level" << CGoGNendl ;
43
44
}

Pierre Kraemer's avatar
Pierre Kraemer committed
45
46
inline void GenericMap::incCurrentLevel()
{
47
	if(m_mrCurrentLevel < m_mrDarts.size() - 1)
Pierre Kraemer's avatar
Pierre Kraemer committed
48
49
50
51
52
53
54
55
56
57
58
59
60
		++m_mrCurrentLevel ;
	else
		CGoGNout << "incCurrentLevel : already at maximum resolution level" << CGoGNendl ;
}

inline void GenericMap::decCurrentLevel()
{
	if(m_mrCurrentLevel > 0)
		--m_mrCurrentLevel ;
	else
		CGoGNout << "decCurrentLevel : already at minimum resolution level" << CGoGNendl ;
}

61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
inline void GenericMap::pushLevel()
{
	m_mrLevelStack.push_back(m_mrCurrentLevel) ;
}

inline void GenericMap::popLevel()
{
	m_mrCurrentLevel = m_mrLevelStack.back() ;
	m_mrLevelStack.pop_back() ;
}

inline unsigned int GenericMap::getMaxLevel()
{
	return m_mrDarts.size() - 1 ;
}

Pierre Kraemer's avatar
Pierre Kraemer committed
77
78
79
80
81
82
/****************************************
 *           DARTS MANAGEMENT           *
 ****************************************/

inline Dart GenericMap::newDart()
{
Pierre Kraemer's avatar
Pierre Kraemer committed
83
	unsigned int di = m_attribs[DART].insertLine();
Pierre Kraemer's avatar
Pierre Kraemer committed
84
	for(unsigned int i = 0; i < NB_ORBITS; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
85
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
86
		if (m_embeddings[i])
Pierre Kraemer's avatar
Pierre Kraemer committed
87
88
			(*m_embeddings[i])[di] = EMBNULL ;
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
89

Pierre Kraemer's avatar
Pierre Kraemer committed
90
91
92
	if (m_isMultiRes)
	{
		unsigned int mrdi = m_mrattribs.insertLine() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
93
94
		(*m_mrLevels)[mrdi] = m_mrCurrentLevel ;
		m_mrNbDarts[m_mrCurrentLevel]++ ;
Pierre Kraemer's avatar
Pierre Kraemer committed
95

Pierre Kraemer's avatar
Pierre Kraemer committed
96
		for(unsigned int i = 0; i < m_mrCurrentLevel; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
97
			(*m_mrDarts[i])[mrdi] = MRNULL ;
Pierre Kraemer's avatar
Pierre Kraemer committed
98

Pierre Kraemer's avatar
Pierre Kraemer committed
99
		(*m_mrDarts[m_mrCurrentLevel])[mrdi] = di ;
Pierre Kraemer's avatar
Pierre Kraemer committed
100
101

		for(unsigned int i = m_mrCurrentLevel + 1; i < m_mrDarts.size(); ++i)
102
			(*m_mrDarts[i])[mrdi] = di ; // newCopyOfDartLine(di) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
103

Pierre Kraemer's avatar
Pierre Kraemer committed
104
105
		return Dart::create(mrdi) ;
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
106

Pierre Kraemer's avatar
Pierre Kraemer committed
107
	return Dart::create(di) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
108
109
110
111
}

inline void GenericMap::deleteDart(Dart d)
{
Pierre Kraemer's avatar
Pierre Kraemer committed
112
113
	if(m_isMultiRes)
	{
114
115
116
117
		// a MRdart can only be deleted on its insertion level
		assert(getDartLevel(d) == m_mrCurrentLevel || !"deleteDart : try to delete a dart on a level greater than its insertion level") ;

		for(unsigned int i = m_mrCurrentLevel; i < m_mrDarts.size(); ++i)
118
119
120
121
122
		{
			unsigned int index = (*m_mrDarts[i])[d.index] ;
			if(isDartValid(index))
				deleteDartLine(index) ;
		}
123
124
		m_mrattribs.removeLine(d.index) ;
		m_mrNbDarts[m_mrCurrentLevel]-- ;
Pierre Kraemer's avatar
Pierre Kraemer committed
125
126
127
128
129
130
131
132
133
134
135
	}
	else
		deleteDartLine(dartIndex(d)) ;
}

inline void GenericMap::deleteDartLine(unsigned int index)
{
	m_attribs[DART].removeLine(index) ;	// free the dart line

	for (unsigned int t = 0; t < m_nbThreads; ++t)	// clear markers of
		(*m_markTables[DART][t])[index].clear() ;	// the removed dart
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
136

Pierre Kraemer's avatar
Pierre Kraemer committed
137
138
	for(unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit)
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
139
		if (m_embeddings[orbit])									// for each embedded orbit
Pierre Kraemer's avatar
Pierre Kraemer committed
140
		{
Pierre Kraemer's avatar
Pierre Kraemer committed
141
			unsigned int emb = (*m_embeddings[orbit])[index] ;		// get the embedding of the dart
Pierre Kraemer's avatar
Pierre Kraemer committed
142
			if(emb != EMBNULL)
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
143
			{
Pierre Kraemer's avatar
Pierre Kraemer committed
144
				if(m_attribs[orbit].unrefLine(emb))					// unref the pointed embedding line
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
145
				{
Pierre Kraemer's avatar
Pierre Kraemer committed
146
147
					for (unsigned int t = 0; t < m_nbThreads; ++t)	// and clear its markers if it was
						(*m_markTables[orbit][t])[emb].clear() ;	// its last unref (and was thus freed)
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
148
149
				}
			}
Pierre Kraemer's avatar
Pierre Kraemer committed
150
151
		}
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
152
}
Pierre Kraemer's avatar
Pierre Kraemer committed
153

Pierre Kraemer's avatar
Pierre Kraemer committed
154
inline unsigned int GenericMap::newCopyOfDartLine(unsigned int index)
Pierre Kraemer's avatar
Pierre Kraemer committed
155
{
156
157
	unsigned int newindex = m_attribs[DART].insertLine() ;	// create a new dart line
	m_attribs[DART].copyLine(newindex, index) ;				// copy the given dart line
Pierre Kraemer's avatar
Pierre Kraemer committed
158
159
	for(unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit)
	{
160
161
		if (m_embeddings[orbit])							// put the embeddings of the
			(*m_embeddings[orbit])[newindex] = EMBNULL ;	// new line to EMBNULL
162
163
164
165
166
//		{
//		unsigned int emb = (*m_embeddings[orbit])[newindex] ;
//		if(emb != EMBNULL)
//			m_attribs[orbit].refLine(emb) ;
//		}
Pierre Kraemer's avatar
Pierre Kraemer committed
167
168
	}
	return newindex ;
Pierre Kraemer's avatar
Pierre Kraemer committed
169
170
}

Pierre Kraemer's avatar
Pierre Kraemer committed
171
inline unsigned int GenericMap::dartIndex(Dart d)
Pierre Kraemer's avatar
Pierre Kraemer committed
172
{
Pierre Kraemer's avatar
Pierre Kraemer committed
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
	if (m_isMultiRes)
		return (*m_mrDarts[m_mrCurrentLevel])[d.index] ;
	return d.index;
}

inline unsigned int GenericMap::getDartLevel(Dart d)
{
	return (*m_mrLevels)[d.index] ;
}

inline unsigned int GenericMap::getNbInsertedDarts(unsigned int level)
{
	if(level < m_mrDarts.size())
		return m_mrNbDarts[level] ;
	else
		return 0 ;
}

inline unsigned int GenericMap::getNbDarts(unsigned int level)
{
	if(level < m_mrDarts.size())
Pierre Kraemer's avatar
Pierre Kraemer committed
194
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
195
196
197
198
		unsigned int nb = 0 ;
		for(unsigned int i = 0; i <= level; ++i)
			nb += m_mrNbDarts[i] ;
		return nb ;
Pierre Kraemer's avatar
Pierre Kraemer committed
199
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
200
201
202
203
204
205
206
207
208
	else
		return 0 ;
}

inline unsigned int GenericMap::getNbDarts()
{
	if(m_isMultiRes)
		return getNbDarts(m_mrCurrentLevel) ;

209
	return m_attribs[DART].size() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
210
211
}

Pierre Kraemer's avatar
Pierre Kraemer committed
212
213
214
215
216
inline bool GenericMap::isDartValid(Dart d)
{
	return !d.isNil() && m_attribs[DART].used(dartIndex(d)) ;
}

Pierre Kraemer's avatar
Pierre Kraemer committed
217
218
219
220
221
222
/****************************************
 *         EMBEDDING MANAGEMENT         *
 ****************************************/

inline bool GenericMap::isOrbitEmbedded(unsigned int orbit) const
{
223
	return (orbit == DART) || (m_embeddings[orbit] != NULL) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
224
225
226
227
228
229
230
231
232
233
234
}

inline unsigned int GenericMap::nbEmbeddings() const
{
	unsigned int nb = 0;
	for(unsigned int i = 0; i < NB_ORBITS; ++i)
		if (isOrbitEmbedded(i))
			++nb;
	return nb ;
}

Pierre Kraemer's avatar
Pierre Kraemer committed
235
inline unsigned int GenericMap::getEmbedding(unsigned int orbit, Dart d)
Pierre Kraemer's avatar
Pierre Kraemer committed
236
237
238
{
	assert(isOrbitEmbedded(orbit) || !"Invalid parameter: orbit not embedded");

239
240
	unsigned int d_index = dartIndex(d);

241
	if (orbit == DART)
242
		return d_index;
Pierre Kraemer's avatar
Pierre Kraemer committed
243

244
	return (*m_embeddings[orbit])[d_index] ;
Pierre Kraemer's avatar
Pierre Kraemer committed
245
246
}

Pierre Kraemer's avatar
Pierre Kraemer committed
247
inline void GenericMap::copyDartEmbedding(unsigned int orbit, Dart dest, Dart src)
Pierre Kraemer's avatar
Pierre Kraemer committed
248
249
{
	assert(isOrbitEmbedded(orbit) || !"Invalid parameter: orbit not embedded");
Pierre Kraemer's avatar
Pierre Kraemer committed
250
	setDartEmbedding(orbit, dest, getEmbedding(orbit, src));
Pierre Kraemer's avatar
Pierre Kraemer committed
251
252
253
254
255
256
257
258
259
260
261
}

inline unsigned int GenericMap::newCell(unsigned int orbit)
{
	assert(isOrbitEmbedded(orbit) || !"Invalid parameter: orbit not embedded");
	return m_attribs[orbit].insertLine();
}

inline void GenericMap::embedOrbit(unsigned int orbit, Dart d, unsigned int em)
{
	assert(isOrbitEmbedded(orbit) || !"Invalid parameter: orbit not embedded");
Pierre Kraemer's avatar
merge..  
Pierre Kraemer committed
262
	FunctorSetEmb<GenericMap> fsetemb(*this, orbit, em);
Pierre Kraemer's avatar
Pierre Kraemer committed
263
264
265
266
267
268
269
270
271
272
273
274
275
276
	foreach_dart_of_orbit(orbit, d, fsetemb);
}

inline unsigned int GenericMap::embedNewCell(unsigned int orbit, Dart d)
{
	assert(isOrbitEmbedded(orbit) || !"Invalid parameter: orbit not embedded");
	unsigned int em = newCell(orbit);
	embedOrbit(orbit, d, em);
	return em;
}

inline void GenericMap::copyCell(unsigned int orbit, Dart d, Dart e)
{
	assert(isOrbitEmbedded(orbit) || !"Invalid parameter: orbit not embedded");
Pierre Kraemer's avatar
Pierre Kraemer committed
277
278
	unsigned int dE = getEmbedding(orbit, d) ;
	unsigned int eE = getEmbedding(orbit, e) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
279
280
281
282
283
284
285
286
287
288
289
	if(eE != EMBNULL)	// if the source is NULL, nothing to copy
	{
		if(dE == EMBNULL)	// if the dest is NULL, create a new cell
			dE = embedNewCell(orbit, d) ;
		m_attribs[orbit].copyLine(dE, eE) ;	// copy the data
	}
}

inline void GenericMap::copyCell(unsigned int orbit, unsigned int i, unsigned int j)
{
	assert(isOrbitEmbedded(orbit) || !"Invalid parameter: orbit not embedded");
Pierre Kraemer's avatar
Pierre Kraemer committed
290
	m_attribs[orbit].copyLine(i, j) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
291
292
293
294
295
296
297
298
299
300
301
302
}

inline void GenericMap::initCell(unsigned int orbit, unsigned int i)
{
	assert(isOrbitEmbedded(orbit) || !"Invalid parameter: orbit not embedded");
	m_attribs[orbit].initLine(i) ;
}

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

303
inline AttributeContainer& GenericMap::getAttributeContainer(unsigned int orbit)
Pierre Kraemer's avatar
Pierre Kraemer committed
304
{
305
	return m_attribs[orbit] ;
Pierre Kraemer's avatar
Pierre Kraemer committed
306
307
}

Pierre Kraemer's avatar
Pierre Kraemer committed
308
inline AttributeMultiVector<Mark>* GenericMap::getMarkVector(unsigned int orbit, unsigned int thread)
Pierre Kraemer's avatar
Pierre Kraemer committed
309
{
310
	assert(isOrbitEmbedded(orbit) || !"Invalid parameter: orbit not embedded") ;
Pierre Kraemer's avatar
Pierre Kraemer committed
311
	return m_markTables[orbit][thread] ;
Pierre Kraemer's avatar
Pierre Kraemer committed
312
313
}

314
inline AttributeMultiVector<unsigned int>* GenericMap::getEmbeddingAttributeVector(unsigned int orbit)
Pierre Kraemer's avatar
Pierre Kraemer committed
315
{
316
	return m_embeddings[orbit] ;
Pierre Kraemer's avatar
Pierre Kraemer committed
317
318
319
320
321
322
323
324
}

/****************************************
 *           DARTS TRAVERSALS           *
 ****************************************/

inline Dart GenericMap::begin()
{
325
326
327
328
329
330
331
332
333
	if (m_isMultiRes)
	{
		unsigned int d = m_mrattribs.begin() ;
		while (getDartLevel(d) > m_mrCurrentLevel)
			m_mrattribs.next(d) ;
		return Dart::create(d) ;
	}

	return Dart::create(m_attribs[DART].begin()) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
334
335
336
337
}

inline Dart GenericMap::end()
{
338
339
340
	if (m_isMultiRes)
		return Dart::create(m_mrattribs.end()) ;

341
	return Dart::create(m_attribs[DART].end()) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
342
343
344
345
}

inline void GenericMap::next(Dart& d)
{
346
347
	if (m_isMultiRes)
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
348
349
		do
		{
350
			m_mrattribs.next(d.index) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
351
		} while (d.index != m_mrattribs.end() && getDartLevel(d) > m_mrCurrentLevel) ;
352
353
354
	}
	else
		m_attribs[DART].next(d.index) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
355
356
}

Sylvain Thery's avatar
Sylvain Thery committed
357
358
359
360
361
362
363
364
365
366
367
/****************************************
 *  TOPOLOGICAL ATTRIBUTES MANAGEMENT   *
 ****************************************/

inline AttributeMultiVector<Dart>* GenericMap::addRelation(const std::string& name)
{
	AttributeContainer& cont = m_attribs[DART] ;
	AttributeMultiVector<Dart>* amv = cont.addAttribute<Dart>(name) ;

	// set new relation to fix point for all the darts of the map
	for(unsigned int i = cont.begin(); i < cont.end(); cont.next(i))
Pierre Kraemer's avatar
Pierre Kraemer committed
368
		(*amv)[i] = i ;
Sylvain Thery's avatar
Sylvain Thery committed
369
370
371
372

	return amv ;
}

Sylvain Thery's avatar
Sylvain Thery committed
373
374
375
376
377
378
379
inline AttributeMultiVector<Dart>* GenericMap::getRelation(const std::string& name)
{
	AttributeContainer& cont = m_attribs[DART] ;
	AttributeMultiVector<Dart>* amv = cont.getDataVector<Dart>(cont.getAttributeIndex(name)) ;
	return amv ;
}

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