traversor2.h 13.9 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 __TRAVERSOR2_H__
#define __TRAVERSOR2_H__

#include "Topology/generic/dart.h"
29
#include "Topology/generic/cells.h"
Sylvain Thery's avatar
Sylvain Thery committed
30
#include "Topology/generic/traversor/iterTrav.h"
Pierre Kraemer's avatar
Pierre Kraemer committed
31 32 33

namespace CGoGN
{
34

Pierre Kraemer's avatar
Pierre Kraemer committed
35 36 37 38
/*******************************************************************************
					VERTEX CENTERED TRAVERSALS
*******************************************************************************/

Pierre Kraemer's avatar
Pierre Kraemer committed
39 40
// Traverse the edges incident to a given vertex
template <typename MAP>
41
class Traversor2VE
Pierre Kraemer's avatar
Pierre Kraemer committed
42 43
{
private:
Sylvain Thery's avatar
Sylvain Thery committed
44
	const MAP& m ;
45 46
	Edge start ;
	Edge current ;
Sylvain Thery's avatar
Sylvain Thery committed
47 48
	const std::vector<Dart>* m_QLT;
	std::vector<Dart>::const_iterator m_ItDarts;
Pierre Kraemer's avatar
Pierre Kraemer committed
49
public:
50
	Traversor2VE(const MAP& map, Vertex dart) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
51

52 53 54
	inline Edge begin() ;
	inline Edge end() ;
	inline Edge next() ;
55 56 57 58

	typedef Edge IterType;
	typedef Vertex ParamType;
	typedef MAP MapType;
Pierre Kraemer's avatar
Pierre Kraemer committed
59 60 61 62
} ;

// Traverse the faces incident to a given vertex
template <typename MAP>
63
class Traversor2VF
Pierre Kraemer's avatar
Pierre Kraemer committed
64 65
{
private:
Sylvain Thery's avatar
Sylvain Thery committed
66
	const MAP& m ;
67 68
	Face start ;
	Face current ;
Sylvain Thery's avatar
Sylvain Thery committed
69 70
	const std::vector<Dart>* m_QLT;
	std::vector<Dart>::const_iterator m_ItDarts;
Pierre Kraemer's avatar
Pierre Kraemer committed
71
public:
72
	Traversor2VF(const MAP& map, Vertex dart) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
73

74 75 76
	inline Face begin() ;
	inline Face end() ;
	inline Face next() ;
77 78 79 80

	typedef Face IterType;
	typedef Vertex ParamType;
	typedef MAP MapType;
Pierre Kraemer's avatar
Pierre Kraemer committed
81 82 83 84
} ;

// Traverse the vertices adjacent to a given vertex through sharing a common edge
template <typename MAP>
85
class Traversor2VVaE
Pierre Kraemer's avatar
Pierre Kraemer committed
86 87
{
private:
Sylvain Thery's avatar
Sylvain Thery committed
88
	const MAP& m ;
89 90
	Vertex start ;
	Vertex current ;
Sylvain Thery's avatar
Sylvain Thery committed
91 92
	const std::vector<Dart>* m_QLT;
	std::vector<Dart>::const_iterator m_ItDarts;
Pierre Kraemer's avatar
Pierre Kraemer committed
93
public:
94
	Traversor2VVaE(const MAP& map, Vertex dart) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
95

96 97 98
	inline Vertex begin() ;
	inline Vertex end() ;
	inline Vertex next() ;
99 100 101 102

	typedef Vertex IterType;
	typedef Vertex ParamType;
	typedef MAP MapType;
Pierre Kraemer's avatar
Pierre Kraemer committed
103 104 105 106
} ;

// Traverse the vertices adjacent to a given vertex through sharing a common face
template <typename MAP>
107
class Traversor2VVaF
Pierre Kraemer's avatar
Pierre Kraemer committed
108 109
{
private:
Sylvain Thery's avatar
Sylvain Thery committed
110
	const MAP& m ;
111 112
	Vertex start ;
	Vertex current ;
Pierre Kraemer's avatar
Pierre Kraemer committed
113

114
	Vertex stop ;
Sylvain Thery's avatar
Sylvain Thery committed
115 116
	const std::vector<Dart>* m_QLT;
	std::vector<Dart>::const_iterator m_ItDarts;
Pierre Kraemer's avatar
Pierre Kraemer committed
117
public:
118
	Traversor2VVaF(const MAP& map, Vertex dart) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
119

120 121 122
	inline Vertex begin() ;
	inline Vertex end() ;
	inline Vertex next() ;
123 124 125 126

	typedef Vertex IterType;
	typedef Vertex ParamType;
	typedef MAP MapType;
Pierre Kraemer's avatar
Pierre Kraemer committed
127 128 129 130 131 132 133 134
} ;

/*******************************************************************************
					EDGE CENTERED TRAVERSALS
*******************************************************************************/

// Traverse the vertices incident to a given edge
template <typename MAP>
135
class Traversor2EV
Pierre Kraemer's avatar
Pierre Kraemer committed
136 137
{
private:
Sylvain Thery's avatar
Sylvain Thery committed
138
	const MAP& m ;
139 140
	Vertex start ;
	Vertex current ;
Sylvain Thery's avatar
Sylvain Thery committed
141 142
	const std::vector<Dart>* m_QLT;
	std::vector<Dart>::const_iterator m_ItDarts;
Pierre Kraemer's avatar
Pierre Kraemer committed
143
public:
144
	Traversor2EV(const MAP& map, Edge dart) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
145

146 147 148
	inline Vertex begin() ;
	inline Vertex end() ;
	inline Vertex next() ;
149 150 151 152

	typedef Vertex IterType;
	typedef Edge ParamType;
	typedef MAP MapType;
Pierre Kraemer's avatar
Pierre Kraemer committed
153 154 155 156
} ;

// Traverse the faces incident to a given edge
template <typename MAP>
157
class Traversor2EF
Pierre Kraemer's avatar
Pierre Kraemer committed
158 159
{
private:
Sylvain Thery's avatar
Sylvain Thery committed
160
	const MAP& m ;
161 162
	Face start ;
	Face current ;
Sylvain Thery's avatar
Sylvain Thery committed
163 164
	const std::vector<Dart>* m_QLT;
	std::vector<Dart>::const_iterator m_ItDarts;
Pierre Kraemer's avatar
Pierre Kraemer committed
165
public:
166
	Traversor2EF(const MAP& map, Edge dart) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
167

168 169 170
	inline Face begin() ;
	inline Face end() ;
	inline Face next() ;
171 172 173 174

	typedef Face IterType;
	typedef Edge ParamType;
	typedef MAP MapType;
Pierre Kraemer's avatar
Pierre Kraemer committed
175 176 177 178
} ;

// Traverse the edges adjacent to a given edge through sharing a common vertex
template <typename MAP>
179
class Traversor2EEaV
Pierre Kraemer's avatar
Pierre Kraemer committed
180 181
{
private:
Sylvain Thery's avatar
Sylvain Thery committed
182
	const MAP& m ;
183 184
	Edge start ;
	Edge current ;
Pierre Kraemer's avatar
Pierre Kraemer committed
185

186
	Edge stop1, stop2 ;
Sylvain Thery's avatar
Sylvain Thery committed
187 188
	const std::vector<Dart>* m_QLT;
	std::vector<Dart>::const_iterator m_ItDarts;
Pierre Kraemer's avatar
Pierre Kraemer committed
189
public:
190
	Traversor2EEaV(const MAP& map, Edge dart) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
191

192 193 194
	inline Edge begin() ;
	inline Edge end() ;
	inline Edge next() ;
195 196 197 198

	typedef Edge IterType;
	typedef Edge ParamType;
	typedef MAP MapType;
Pierre Kraemer's avatar
Pierre Kraemer committed
199 200 201 202
} ;

// Traverse the edges adjacent to a given edge through sharing a common face
template <typename MAP>
203
class Traversor2EEaF
Pierre Kraemer's avatar
Pierre Kraemer committed
204 205
{
private:
Sylvain Thery's avatar
Sylvain Thery committed
206
	const MAP& m ;
207 208
	Edge start ;
	Edge current ;
Pierre Kraemer's avatar
Pierre Kraemer committed
209

210
	Edge stop1, stop2 ;
Sylvain Thery's avatar
Sylvain Thery committed
211 212
	const std::vector<Dart>* m_QLT;
	std::vector<Dart>::const_iterator m_ItDarts;
Pierre Kraemer's avatar
Pierre Kraemer committed
213
public:
214
	Traversor2EEaF(const MAP& map, Edge dart) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
215

216 217 218
	inline Edge begin() ;
	inline Edge end() ;
	inline Edge next() ;
219 220 221 222

	typedef Edge IterType;
	typedef Edge ParamType;
	typedef MAP MapType;
Pierre Kraemer's avatar
Pierre Kraemer committed
223 224 225 226 227 228 229 230
} ;

/*******************************************************************************
					FACE CENTERED TRAVERSALS
*******************************************************************************/

// Traverse the vertices incident to a given face
template <typename MAP>
231
class Traversor2FV
Pierre Kraemer's avatar
Pierre Kraemer committed
232 233
{
private:
Sylvain Thery's avatar
Sylvain Thery committed
234
	const MAP& m ;
235 236
	Vertex start ;
	Vertex current ;
Sylvain Thery's avatar
Sylvain Thery committed
237 238
	const std::vector<Dart>* m_QLT;
	std::vector<Dart>::const_iterator m_ItDarts;
Pierre Kraemer's avatar
Pierre Kraemer committed
239
public:
240
	Traversor2FV(const MAP& map, Face dart) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
241

242 243 244
	inline Vertex begin() ;
	inline Vertex end() ;
	inline Vertex next() ;
245 246 247 248

	typedef Vertex IterType;
	typedef Face ParamType;
	typedef MAP MapType;
Pierre Kraemer's avatar
Pierre Kraemer committed
249 250
} ;

251

252 253 254 255 256 257 258 259 260
//// Traverse the edges incident to a given face (equivalent to vertices)
//template <typename MAP>
//class Traversor2FE: public Traversor2FV<MAP>
//{
//public:
//	Traversor2FE(const MAP& map, Dart dart):Traversor2FV<MAP>(map,dart){}
//} ;

// Traverse the vertices incident to a given face
Pierre Kraemer's avatar
Pierre Kraemer committed
261
template <typename MAP>
262
class Traversor2FE
Pierre Kraemer's avatar
Pierre Kraemer committed
263
{
264 265 266 267 268 269
private:
	const MAP& m ;
	Edge start ;
	Edge current ;
	const std::vector<Dart>* m_QLT;
	std::vector<Dart>::const_iterator m_ItDarts;
Pierre Kraemer's avatar
Pierre Kraemer committed
270
public:
271 272 273 274 275
	Traversor2FE(const MAP& map, Face dart) ;

	inline Edge begin() ;
	inline Edge end() ;
	inline Edge next() ;
276 277 278 279

	typedef Edge IterType;
	typedef Face ParamType;
	typedef MAP MapType;
Pierre Kraemer's avatar
Pierre Kraemer committed
280 281
} ;

282

Pierre Kraemer's avatar
Pierre Kraemer committed
283 284
// Traverse the faces adjacent to a given face through sharing a common vertex
template <typename MAP>
285
class Traversor2FFaV
Pierre Kraemer's avatar
Pierre Kraemer committed
286 287
{
private:
Sylvain Thery's avatar
Sylvain Thery committed
288
	const MAP& m ;
289 290
	Face start ;
	Face current ;
Pierre Kraemer's avatar
Pierre Kraemer committed
291

292
	Face stop ;
Sylvain Thery's avatar
Sylvain Thery committed
293 294
	const std::vector<Dart>* m_QLT;
	std::vector<Dart>::const_iterator m_ItDarts;
Pierre Kraemer's avatar
Pierre Kraemer committed
295
public:
296
	Traversor2FFaV(const MAP& map, Face dart) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
297

298 299 300
	inline Face begin() ;
	inline Face end() ;
	inline Face next() ;
301 302 303 304

	typedef Face IterType;
	typedef Face ParamType;
	typedef MAP MapType;
Pierre Kraemer's avatar
Pierre Kraemer committed
305 306
} ;

Pierre Kraemer's avatar
Pierre Kraemer committed
307
// Traverse the faces adjacent to a given face through sharing a common edge
thery's avatar
thery committed
308
// Warning mult-incidence is not managed (some faces can be send several times)
Pierre Kraemer's avatar
Pierre Kraemer committed
309
template <typename MAP>
310
class Traversor2FFaE
Pierre Kraemer's avatar
Pierre Kraemer committed
311 312
{
private:
Sylvain Thery's avatar
Sylvain Thery committed
313
	const MAP& m ;
314 315
	Face start ;
	Face current ;
Sylvain Thery's avatar
Sylvain Thery committed
316 317
	const std::vector<Dart>* m_QLT;
	std::vector<Dart>::const_iterator m_ItDarts;
Pierre Kraemer's avatar
Pierre Kraemer committed
318
public:
319
	Traversor2FFaE(const MAP& map, Face dart) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
320

321 322 323
	inline Face begin() ;
	inline Face end() ;
	inline Face next() ;
324 325 326 327

	typedef Face IterType;
	typedef Face ParamType;
	typedef MAP MapType;
Pierre Kraemer's avatar
Pierre Kraemer committed
328 329
} ;

330 331 332 333 334

template <typename MAP, unsigned int F, unsigned int T>
class IncidentTrav2
{
public:
335 336
	IncidentTrav2(const MAP&, Cell<F>) {}

337 338 339 340 341 342 343 344
};


template <typename MAP>
class IncidentTrav2<MAP,VERTEX,EDGE>
{
public:
	Traversor2VE<MAP> t;
345
	IncidentTrav2(const MAP& m, Vertex d):t(m,d) {}
346 347 348 349 350 351 352
};

template <typename MAP>
class IncidentTrav2<MAP,VERTEX,FACE>
{
public:
	Traversor2VF<MAP> t;
353
	IncidentTrav2(const MAP& m, Vertex d):t(m,d) {}
354 355 356 357 358 359 360
};

template <typename MAP>
class IncidentTrav2<MAP,EDGE,VERTEX>
{
public:
	Traversor2EV<MAP> t;
361
	IncidentTrav2(const MAP& m, Edge d):t(m,d) {}
362 363 364 365 366 367 368
};

template <typename MAP>
class IncidentTrav2<MAP,EDGE,FACE>
{
public:
	Traversor2EF<MAP> t;
369
	IncidentTrav2(const MAP& m, Edge d):t(m,d) {}
370 371 372 373 374 375 376
};

template <typename MAP>
class IncidentTrav2<MAP,FACE,VERTEX>
{
public:
	Traversor2FV<MAP> t;
377
	IncidentTrav2(const MAP& m, Face d):t(m,d) {}
378 379 380 381 382 383 384
};

template <typename MAP>
class IncidentTrav2<MAP,FACE,EDGE>
{
public:
	Traversor2FE<MAP> t;
385
	IncidentTrav2(const MAP& m, Face d):t(m,d) {}
386 387 388 389 390 391 392 393
};



template <typename MAP, unsigned int F, unsigned int T>
class AdjacentTrav2
{
public:
394
	AdjacentTrav2(const MAP&, Cell<F>) {}
395 396 397 398 399 400 401 402
};


template <typename MAP>
class AdjacentTrav2<MAP,VERTEX,EDGE>
{
public:
	Traversor2VVaE<MAP> t;
403
	AdjacentTrav2(const MAP& m, Vertex d):t(m,d) {}
404 405 406 407 408 409 410
};

template <typename MAP>
class AdjacentTrav2<MAP,VERTEX,FACE>
{
public:
	Traversor2VVaF<MAP> t;
411
	AdjacentTrav2(const MAP& m, Vertex d):t(m,d) {}
412 413 414 415 416 417 418
};

template <typename MAP>
class AdjacentTrav2<MAP,EDGE,VERTEX>
{
public:
	Traversor2EEaV<MAP> t;
419
	AdjacentTrav2(const MAP& m, Edge d):t(m,d) {}
420 421 422 423 424 425 426
};

template <typename MAP>
class AdjacentTrav2<MAP,EDGE,FACE>
{
public:
	Traversor2EEaF<MAP> t;
427
	AdjacentTrav2(const MAP& m, Edge d):t(m,d) {}
428 429 430 431 432 433 434
};

template <typename MAP>
class AdjacentTrav2<MAP,FACE,VERTEX>
{
public:
	Traversor2FFaV<MAP> t;
435
	AdjacentTrav2(const MAP& m, Face d):t(m,d) {}
436 437 438 439 440 441 442
};

template <typename MAP>
class AdjacentTrav2<MAP,FACE,EDGE>
{
public:
	Traversor2FFaE<MAP> t;
443
	AdjacentTrav2(const MAP& m, Face d):t(m,d) {}
444 445
};

446
// foreach traversal function
447

Pierre Kraemer's avatar
Pierre Kraemer committed
448
template <unsigned int ORBIT_TO, unsigned int ORBIT_FROM, typename MAP, typename FUNC>
Pierre Kraemer's avatar
Pierre Kraemer committed
449
inline void foreach_incident2(MAP& map, Cell<ORBIT_FROM> c, FUNC f)
450 451 452 453 454 455
{
	IncidentTrav2<MAP,ORBIT_FROM,ORBIT_TO> trav(const_cast<const MAP&>(map),c);
	for (Cell<ORBIT_TO> c = trav.t.begin(), e = trav.t.end(); c.dart != e.dart; c = trav.t.next())
		f(c);
}

456
template <unsigned int THRU, unsigned int ORBIT, typename MAP, typename FUNC>
Pierre Kraemer's avatar
Pierre Kraemer committed
457
inline void foreach_adjacent2(MAP& map, Cell<ORBIT> c, FUNC f)
458 459 460 461 462 463
{
	AdjacentTrav2<MAP,ORBIT,THRU> trav(const_cast<const MAP&>(map),c);
	for (Cell<ORBIT> c = trav.t.begin(), e = trav.t.end(); c.dart != e.dart; c = trav.t.next())
		f(c);
}

464 465 466 467 468 469


/**
 * template classs that add iterator to Traversor
 * to allow the use of c++11 syntax for (auto d : v)
 */
Sylvain Thery's avatar
Sylvain Thery committed
470 471 472 473 474 475 476
//template <typename TRAV>
//class Iteratorize: public TRAV
//{
//public:
//	typedef typename TRAV::MapType MAP;
//	typedef typename TRAV::IterType ITER;
//	typedef typename TRAV::ParamType PARAM;
477

Sylvain Thery's avatar
Sylvain Thery committed
478 479
//	Iteratorize(const MAP& map, PARAM p):
//		TRAV(map,p){}
480

Sylvain Thery's avatar
Sylvain Thery committed
481 482 483 484
//	class iterator
//	{
//		Iteratorize<TRAV>* m_ptr;
//		ITER m_index;
485

Sylvain Thery's avatar
Sylvain Thery committed
486
//	public:
487

Sylvain Thery's avatar
Sylvain Thery committed
488
//		inline iterator(Iteratorize<TRAV>* p, ITER i): m_ptr(p),m_index(i){}
489

Sylvain Thery's avatar
Sylvain Thery committed
490 491 492 493 494
//		inline iterator& operator++()
//		{
//			m_index = m_ptr->next();
//			return *this;
//		}
495

Sylvain Thery's avatar
Sylvain Thery committed
496 497 498 499
//		inline ITER& operator*()
//		{
//			return m_index;
//		}
500

Sylvain Thery's avatar
Sylvain Thery committed
501 502 503 504
//		inline bool operator!=(const iterator& it)
//		{
//			return m_index.dart != it.m_index.dart;
//		}
505

Sylvain Thery's avatar
Sylvain Thery committed
506
//	};
507

Sylvain Thery's avatar
Sylvain Thery committed
508 509 510 511
//	inline iterator begin()
//	{
//		return iterator(this,TRAV::begin());
//	}
512

Sylvain Thery's avatar
Sylvain Thery committed
513 514 515 516
//	inline iterator end()
//	{
//		return iterator(this,TRAV::end());
//	}
517

Sylvain Thery's avatar
Sylvain Thery committed
518
//};
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598

// functions that return the traversor+iterator
// functions instead of typedef because function
// allows the compiler to deduce template param

template <typename MAP>
inline Iteratorize< Traversor2VE<MAP> > edgesIncidentToVertex2(const MAP& m, Vertex c)
{
	return Iteratorize< Traversor2VE<MAP> >(m, c);
}

template <typename MAP>
inline Iteratorize< Traversor2VF<MAP> > facesIncidentToVertex2(const MAP& m, Vertex c)
{
	return Iteratorize< Traversor2VF<MAP> >(m, c);
}

template <typename MAP>
inline Iteratorize< Traversor2EV<MAP> > verticesIncidentToEdge2(const MAP& m, Edge c)
{
	return Iteratorize< Traversor2EV<MAP> >(m, c);
}

template <typename MAP>
inline Iteratorize< Traversor2EF<MAP> > facesIncidentToEdge2(const MAP& m, Edge c)
{
	return Iteratorize< Traversor2EF<MAP> >(m, c);
}

template <typename MAP>
inline Iteratorize< Traversor2FV<MAP> > verticesIncidentToFace2(const MAP& m, Face c)
{
	return Iteratorize< Traversor2FV<MAP> >(m, c);
}

template <typename MAP>
inline Iteratorize< Traversor2FE<MAP> > edgesIncidentToFace2(const MAP& m, Face c)
{
	return Iteratorize< Traversor2FE<MAP> >(m, c);
}


template <typename MAP>
inline Iteratorize< Traversor2VVaE<MAP> > verticesAdjacentByEdge2(const MAP& m, Vertex c)
{
	return Iteratorize< Traversor2VVaE<MAP> >(m, c);
}

template <typename MAP>
inline Iteratorize< Traversor2VVaF<MAP> > verticesAdjacentByFace2(const MAP& m, Vertex c)
{
	return Iteratorize< Traversor2VVaF<MAP> >(m, c);
}

template <typename MAP>
inline Iteratorize< Traversor2EEaV<MAP> > edgesAdjacentByVertex2(const MAP& m, Edge c)
{
	return Iteratorize< Traversor2EEaV<MAP> >(m, c);
}

template <typename MAP>
inline Iteratorize< Traversor2EEaF<MAP> > edgesAdjacentByFace2(const MAP& m, Edge c)
{
	return Iteratorize< Traversor2EEaF<MAP> >(m, c);
}

template <typename MAP>
inline Iteratorize< Traversor2FFaV<MAP> > facesAdjacentByVertex2(const MAP& m, Face c)
{
	return Iteratorize< Traversor2FFaV<MAP> >(m, c);
}

template <typename MAP>
inline Iteratorize< Traversor2FFaE<MAP> > facesAdjacentByEdge2(const MAP& m, Face c)
{
	return Iteratorize< Traversor2FFaE<MAP> >(m, c);
}



Pierre Kraemer's avatar
Pierre Kraemer committed
599 600
} // namespace CGoGN

601
#include "Topology/generic/traversor/traversor2.hpp"
Pierre Kraemer's avatar
Pierre Kraemer committed
602

Pierre Kraemer's avatar
Pierre Kraemer committed
603
#endif