// Copyright (c) 2010-2011 CNRS and LIRIS' Establishments (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org); 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 3 of the License, // or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ // // Author(s) : Guillaume Damiand // #ifndef CGAL_DART_ITERATORS_HH #define CGAL_DART_ITERATORS_HH 1 #include namespace CGAL { /** @file Dart_iterators.h * Definition of dart iterators. There are 9 iterators: * - CMap_dart_iterator_basic_of_orbit * - CMap_dart_iterator_basic_of_cell * - CMap_dart_iterator_basic_of_all * - CMap_dart_iterator_basic_of_involution * - CMap_dart_iterator_basic_of_involution_inv * - CMap_dart_iterator_of_orbit * - CMap_dart_iterator_of_cell * - CMap_dart_iterator_of_involution * - CMap_dart_iterator_of_involution_inv * but many specializations to optimize specific cases. * */ //**************************************************************************** //**********************BASIC ITERATORS*************************************** //**************************************************************************** /* Class CMap_dart_iterator_basic_of_orbit: to iterate * on the darts of the orbit */ #ifndef CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES template class CMap_dart_iterator_basic_of_orbit_generic; #else template class CMap_dart_iterator_basic_of_orbit_generic; template struct Get_CMap_dart_iterator_basic_of_orbit; template struct Get_CMap_dart_iterator_basic_of_orbit { typedef CMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_CMap_dart_iterator_basic_of_orbit { typedef CMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_CMap_dart_iterator_basic_of_orbit { typedef CMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_CMap_dart_iterator_basic_of_orbit { typedef CMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_CMap_dart_iterator_basic_of_orbit { typedef CMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_CMap_dart_iterator_basic_of_orbit { typedef CMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_CMap_dart_iterator_basic_of_orbit { typedef CMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_CMap_dart_iterator_basic_of_orbit { typedef CMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_CMap_dart_iterator_basic_of_orbit { typedef CMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_CMap_dart_iterator_basic_of_orbit { typedef CMap_dart_iterator_basic_of_orbit_generic type; }; #endif //CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES //**************************************************************************** // Case when Beta... is empty: iterator of self template class CMap_dart_iterator_basic_of_orbit_generic: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_orbit_generic Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); this->set_current_dart(this->mmap->null_handle); this->mprev_op = OP_END; return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_orbit: iterate onto orbit . * Begin by turning around the facet with beta0, then turn if * necessary in the second direction by using beta1. */ template class CMap_dart_iterator_basic_of_orbit_generic: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_orbit_generic Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart): Base(amap, adart), mfirst_dir(true) {} /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart), mfirst_dir(true) {} /// Assignment operator. Self& operator= (const Self & aiterator) { if (this != &aiterator) { Base::operator=(aiterator); mfirst_dir = aiterator.mfirst_dir; } return *this; } /// Rewind of the iterator to its beginning. void rewind() { Base::rewind(); mfirst_dir = true; } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if (mfirst_dir && this->mmap->is_free(*this, 0)) { this->set_current_dart(this->mfirst_dart); mfirst_dir = false; this->mprev_op = OP_JUMP; } else { this->mprev_op = OP_BETAI; } if (mfirst_dir) { CGAL_assertion(!this->mmap->is_free(*this, 0)); this->set_current_dart(this->mmap->beta(*this, 0)); if ((*this)==this->mfirst_dart) { this->set_current_dart(this->mmap->null_handle); this->mprev_op = OP_END; } } else { if (this->mmap->is_free(*this, 1)) { this->set_current_dart(this->mmap->null_handle); this->mprev_op = OP_END; } else { this->set_current_dart(this->mmap->beta(*this, 1)); this->mprev_op = OP_BETAI_INV; } } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } protected: /// Boolean: true iff we turn in the first direction (i.e. using beta0). bool mfirst_dir; }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_orbit: iterate onto orbit . * Begin by turning around the facet with beta1, then turn if * necessary in the second direction by using beta0. */ template class CMap_dart_iterator_basic_of_orbit_generic: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_orbit_generic Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart): Base(amap, adart), mfirst_dir(true) {} /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart), mfirst_dir(true) {} /// Rewind of the iterator to its beginning. void rewind() { Base::rewind(); mfirst_dir = true; } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if (mfirst_dir && this->mmap->is_free(*this, 1)) { this->set_current_dart(this->mfirst_dart); mfirst_dir = false; this->mprev_op = OP_JUMP; } else { this->mprev_op = OP_BETAI; } if (mfirst_dir) { CGAL_assertion(!this->mmap->is_free(*this, 1)); this->set_current_dart(this->mmap->beta(*this, 1)); if ((*this)==this->mfirst_dart) { this->set_current_dart(this->mmap->null_handle); this->mprev_op = OP_END; } } else { if (this->mmap->is_free(*this, 0)) { this->set_current_dart(this->mmap->null_handle); this->mprev_op = OP_END; } else { this->set_current_dart(this->mmap->beta(*this, 0)); this->mprev_op = OP_BETAI_INV; } } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } protected: /// Boolean: true iff we turn in the first direction (i.e. using beta0). bool mfirst_dir; }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_orbit: to iterate * on the darts of the orbit (2<=Bi<=dimension) * (not for beta0 and beta1 which are special cases). */ template class CMap_dart_iterator_basic_of_orbit_generic: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_orbit_generic Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart): Base(amap, adart) { CGAL_static_assertion( Bi>=2 && Bi<=Map::dimension ); } /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) { CGAL_static_assertion( Bi>=2 && Bi<=Map::dimension ); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if ((*this)!=this->mfirst_dart || this->mmap->is_free(*this, Bi)) { this->set_current_dart(this->mmap->null_handle); this->mprev_op = OP_END; } else { this->set_current_dart(this->mmap->beta(*this, Bi)); this->mprev_op = OP_BETAI; } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_two_beta: to iterate * on the darts of the orbit : Bi1 and delta>1. * Basic classes do not guaranty correct marks (i.e. do not unmark darts in * the destructor, possible problem with the rewind). If you are not sure, * use CMap_dart_iterator_basic_of_two_beta. */ template class CMap_dart_iterator_basic_of_two_beta : public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_two_beta Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; CGAL_static_assertion( Bi>1 && delta>1 && Bi+delta<=Map::dimension ); public: /// Main constructor. CMap_dart_iterator_basic_of_two_beta(Map& amap, Dart_handle adart): Base(amap, adart), mcurdart(0) {} /// Main constructor. CMap_dart_iterator_basic_of_two_beta(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart), mcurdart(0) {} /// Rewind of the iterator to its beginning. void rewind() { Base::rewind(); mcurdart=0; } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if (mcurdart==0) { if (!this->mmap->is_free(*this, Bi)) { this->set_current_dart(this->mmap->beta(*this, Bi)); this->mprev_op = OP_BETAI; mcurdart=1; } else { if (!this->mmap->is_free(*this, Bi+delta)) { this->set_current_dart(this->mmap->beta(*this, Bi+delta)); this->mprev_op = OP_BETAJ; mcurdart=3; } else { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } } } else if (mcurdart==1) { if (!this->mmap->is_free(*this, Bi+delta)) { this->set_current_dart(this->mmap->beta(*this, Bi+delta)); this->mprev_op = OP_BETAJ; mcurdart=2; } else { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } } else if (mcurdart==2) { CGAL_assertion(!this->mmap->is_free(*this, Bi)); this->set_current_dart(this->mmap->beta(*this, Bi)); this->mprev_op = OP_BETAI; mcurdart=3; } else { CGAL_assertion (mcurdart==3); this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } private: /// mcurdart: number of the current dart (0,1,2 or 3). char mcurdart; }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_two_beta: to iterate * on the darts of the orbit : Bi class CMap_dart_iterator_basic_of_two_beta : public CMap_extend_iterator , 2> { public: typedef CMap_dart_iterator_basic_of_two_beta Self; typedef CMap_extend_iterator , 2> Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Use_mark; CGAL_static_assertion( 2<=Map::dimension ); public: /// Main constructor. CMap_dart_iterator_basic_of_two_beta(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_two_beta: to iterate * on the darts of the orbit : Bi class CMap_dart_iterator_basic_of_two_beta : public CMap_extend_iterator , 2> { public: typedef CMap_dart_iterator_basic_of_two_beta Self; typedef CMap_extend_iterator , 2> Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Use_mark; CGAL_static_assertion( 2<=Map::dimension ); public: /// Main constructor. CMap_dart_iterator_basic_of_two_beta(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_two_beta: to iterate * on the darts of the orbit : Bi2. * Basic classes do not guaranty correct marks (i.e. do not unmark darts in * the destructor, possible problem with the rewind). If you are not sure, * use CMap_dart_iterator_basic_of_two_beta. */ template class CMap_dart_iterator_basic_of_two_beta : public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_two_beta Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; CGAL_static_assertion( delta>1 && delta<=Map::dimension ); public: /// Main constructor. CMap_dart_iterator_basic_of_two_beta(Map& amap, Dart_handle adart): Base(amap, adart), mit(amap, adart), mexist_betaj(false), mprev_betaj(false), mfirst_border(true) { if (adart!=this->mmap->null_handle) mexist_betaj=!this->mmap->is_free(adart, delta); } /// Main constructor. CMap_dart_iterator_basic_of_two_beta(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart), mit(amap, adart), mexist_betaj(false), mprev_betaj(false), mfirst_border(true) { if (adart!=this->mmap->null_handle) mexist_betaj=!this->mmap->is_free(adart, delta); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if (mexist_betaj && !mprev_betaj) { mprev_betaj = true; mfirst_border = ! mfirst_border; this->set_current_dart(this->mmap->beta(*this, delta)); this->mprev_op = OP_BETAJ; } else { mprev_betaj = false; ++mit; this->mprev_op = mit.prev_operation(); if ( !mit.cont() ) this->set_current_dart(this->mmap->null_handle); else { if ( !mfirst_border ) this->set_current_dart(this->mmap->beta(mit, delta)); else this->set_current_dart(mit); } } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } /// Rewind of the iterator to its beginning. void rewind() { Base::rewind(); mit.rewind(); mprev_betaj = false; mfirst_border = true; } private: /// Iterator on beta0 CMap_dart_iterator_basic_of_orbit_generic mit; /// Boolean: true iff there are two half facets. bool mexist_betaj; /// Boolean: true iff the last ++ used betaj. bool mprev_betaj; /// Boolean: true iff the current dart is on the first border. bool mfirst_border; }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_two_beta: to iterate * on the darts of the orbit : Bi1. * Basic classes do not guaranty correct marks (i.e. do not unmark darts in * the destructor, possible problem with the rewind). If you are not sure, * use CMap_dart_iterator_basic_of_two_beta. */ template class CMap_dart_iterator_basic_of_two_beta : public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_two_beta Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; CGAL_static_assertion( delta>1 && delta+1<=Map::dimension ); public: /// Main constructor. CMap_dart_iterator_basic_of_two_beta(Map& amap, Dart_handle adart): Base(amap, adart), mit(amap, adart), mexist_betaj(false), mprev_betaj(false), mfirst_border(true) { if (adart!=this->mmap->null_handle) mexist_betaj=!this->mmap->is_free(adart, 1+delta); } /// Main constructor. CMap_dart_iterator_basic_of_two_beta(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart), mit(amap, adart), mexist_betaj(false), mprev_betaj(false), mfirst_border(true) { if (adart!=this->mmap->null_handle) mexist_betaj=!this->mmap->is_free(adart, 1+delta); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if (mexist_betaj && !mprev_betaj) { mprev_betaj = true; mfirst_border = ! mfirst_border; this->set_current_dart(this->mmap->beta(*this, 1+delta)); this->mprev_op = OP_BETAJ; } else { mprev_betaj = false; ++mit; this->mprev_op = mit.prev_operation(); if ( !mit.cont() ) this->set_current_dart(this->mmap->null_handle); else { if ( !mfirst_border ) this->set_current_dart(this->mmap->beta(mit, 1+delta)); else this->set_current_dart(mit); } } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } /// Rewind of the iterator to its beginning. void rewind() { Base::rewind(); mit.rewind(); mprev_betaj = false; mfirst_border = true; } private: /// Iterator on beta1 CMap_dart_iterator_basic_of_orbit_generic mit; /// Boolean: true iff there are two half facets. bool mexist_betaj; /// Boolean: true iff the last ++ used betaj. bool mprev_betaj; /// Boolean: true iff the current dart is on the first border. bool mfirst_border; }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_two_beta: to iterate * on the darts of the orbit : Bi1 and delta==1. * Basic classes do not guaranty correct marks (i.e. do not unmark darts in * the destructor, possible problem with the rewind). If you are not sure, * use CMap_dart_iterator_basic_of_two_beta. */ template class CMap_dart_iterator_basic_of_two_beta : public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_two_beta Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; CGAL_static_assertion( Bi>1 && Bi+1<=Map::dimension ); public: /// Main constructor. CMap_dart_iterator_basic_of_two_beta(Map& amap, Dart_handle adart): Base(amap, adart), mfirst_dir(true), mnext_try_betai(true) {} /// Main constructor. CMap_dart_iterator_basic_of_two_beta(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart), mfirst_dir(true), mnext_try_betai(true) {} /// Rewind of the iterator to its beginning. void rewind() { Base::rewind(); mfirst_dir = true; mnext_try_betai = true; } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if (mfirst_dir) { if (mnext_try_betai) { if (this->mmap->is_free(*this, Bi)) { mfirst_dir = false; if (this->mmap->is_free(this->mfirst_dart, Bi+1)) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else { this->set_current_dart(this->mmap->beta(this->mfirst_dart, Bi+1)); this->mprev_op = OP_JUMP; } } else { this->set_current_dart(this->mmap->beta(*this, Bi)); mnext_try_betai = false; this->mprev_op = OP_BETAI; } } else { if (this->mmap->is_free(*this, Bi+1)) { mfirst_dir = false; if (this->mmap->is_free(this->mfirst_dart, Bi+1)) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else { this->set_current_dart(this->mmap->beta(this->mfirst_dart, Bi+1)); mnext_try_betai = true; this->mprev_op = OP_JUMP; } } else { this->set_current_dart(this->mmap->beta(*this, Bi+1)); if ((*this)==this->mfirst_dart) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else { mnext_try_betai = true; this->mprev_op = OP_BETAJ; } } } } else { if (mnext_try_betai) { if (this->mmap->is_free(*this, Bi)) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else { this->set_current_dart(this->mmap->beta(*this, Bi)); mnext_try_betai = false; this->mprev_op = OP_BETAI; } } else { if (this->mmap->is_free(*this, Bi+1)) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else { this->set_current_dart(this->mmap->beta(*this, Bi+1)); mnext_try_betai = true; this->mprev_op = OP_BETAJ; } } } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } private: /// Boolean: true iff we turn in the first direction (i.e. using betai). bool mfirst_dir; /// Boolean: true iff the next ++ must use betai. bool mnext_try_betai; }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_orbit: to iterate * on the darts of the orbit : Bi class CMap_dart_iterator_basic_of_orbit_generic: public CMap_dart_iterator_basic_of_two_beta { public: typedef CMap_dart_iterator_basic_of_orbit_generic Self; typedef CMap_dart_iterator_basic_of_two_beta Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef typename Base::Use_mark Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart) : Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; //**************************************************************************** /* Generic nD version. */ #ifndef CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES template class CMap_dart_iterator_basic_of_orbit_generic: public CMap_extend_iterator, Bk> { public: typedef CMap_dart_iterator_basic_of_orbit_generic Self; typedef CMap_extend_iterator, Bk> Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; #else //CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES template class CMap_dart_iterator_basic_of_orbit_generic: public CMap_extend_iterator ::type, B3> { public: typedef typename Get_CMap_dart_iterator_basic_of_orbit ::type Self; typedef CMap_extend_iterator ::type, B3> Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; #endif //CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES //**************************************************************************** // TODO? we can optimize the iterators when // 1 class CMap_dart_iterator_basic_of_orbit: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_orbit Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Map::Dart_handle Dart_handle; typedef typename Map::size_type size_type; /// Main constructor. CMap_dart_iterator_basic_of_orbit(Map& amap,Dart_handle adart): Base(amap,adart) {} /// Main constructor. CMap_dart_iterator_basic_of_orbit(Map& amap,Dart_handle adart,size_type amark): Base(amap,adart,amark) {} }; #else //**************************************************************************** template class CMap_dart_iterator_basic_of_orbit: public Get_CMap_dart_iterator_basic_of_orbit::type { public: typedef CMap_dart_iterator_basic_of_orbit Self; typedef typename Get_CMap_dart_iterator_basic_of_orbit ::type Base; typedef typename Map::Dart_handle Dart_handle; typedef typename Map::size_type size_type; /// Main constructor. CMap_dart_iterator_basic_of_orbit(Map& amap,Dart_handle adart): Base(amap,adart) {} /// Main constructor. CMap_dart_iterator_basic_of_orbit(Map& amap,Dart_handle adart,size_type amark): Base(amap,adart,amark) {} }; #endif // CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES //**************************************************************************** /* Class CMap_dart_iterator_basic_of_all: to iterate onto all the * darts of the map. */ template class CMap_dart_iterator_basic_of_all: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_all Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_all(Map& amap): Base(amap, amap.darts().begin()) {} /// Main constructor. CMap_dart_iterator_basic_of_all(Map& amap, size_type /*amark*/): Base(amap, amap.darts().begin()) {} /// Constructor with a dart in parameter (for end iterator). CMap_dart_iterator_basic_of_all(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Constructor with a dart in parameter (for end iterator). CMap_dart_iterator_basic_of_all(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); Base::operator++(); if ( (*this) != this->mmap->darts().end()) { this->mprev_op = OP_POP; } else { this->set_current_dart(this->mmap->null_handle); this->mprev_op = OP_END; } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } }; //**************************************************************************** //***************************CELL*ITERATORS*********************************** //**************************************************************************** //**************************************************************************** // i-Cell iterator in combinatorial map of dimension d, i>1 // i<=Map::dimension+1 (for i==Map::dimension+1, iterate on the connected // component) template class CMap_dart_iterator_basic_of_cell: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_cell Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Use_mark; CGAL_static_assertion( i>1 && i<=Map::dimension+1 ); public: /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart), mmark_number(amark) { if (adart!=this->mmap->null_handle) { this->mmap->mark_null_dart(mmark_number); this->mmap->mark(adart, mmark_number); } } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != Map::INVALID_MARK); Base::rewind(); mto_treat = std::queue(); this->mmap->mark(*this, mmark_number); this->mmap->mark_null_dart(mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != Map::INVALID_MARK); CGAL_assertion(this->cont()); Dart_handle nd = this->mmap->null_handle; for ( unsigned int k=0; kis_unmarked((*this), k, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, k); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETAI; } else { mto_treat.push(this->mmap->beta(*this, k)); } this->mmap->mark(this->mmap->beta(*this, k), mmark_number); } } for ( unsigned int k=i+1; k<=d; ++k ) { if ( this->is_unmarked((*this), k, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, k); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETAI; } else { mto_treat.push(this->mmap->beta(*this, k)); } this->mmap->mark(this->mmap->beta(*this, k), mmark_number); } } if (nd == this->mmap->null_handle) { if (!mto_treat.empty()) { nd = mto_treat.front(); mto_treat.pop(); this->mprev_op = OP_POP; } else { this->mprev_op = OP_END; } } this->set_current_dart(nd); return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } protected: /// Queue of darts to process. std::queue mto_treat; /// Index of the used mark. size_type mmark_number; }; //**************************************************************************** // i-Cell iterator in combinatorial map of dimension d, i==1. template class CMap_dart_iterator_basic_of_cell: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_cell Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart), mmark_number(amark) { if (adart!=this->mmap->null_handle) { this->mmap->mark(adart, mmark_number); this->mmap->mark_null_dart(mmark_number); } } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != Map::INVALID_MARK); Base::rewind(); mto_treat = std::queue(); this->mmap->mark((*this), mmark_number); this->mmap->mark_null_dart(mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != Map::INVALID_MARK); CGAL_assertion(this->cont()); Dart_handle nd = this->mmap->null_handle; for ( unsigned int k=2; k<=d; ++k ) { if ( this->is_unmarked((*this), k, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, k); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETAI; } else { mto_treat.push(this->mmap->beta(*this, k)); } this->mmap->mark(this->mmap->beta(*this, k), mmark_number); } } if (nd == this->mmap->null_handle) { if (!mto_treat.empty()) { nd = mto_treat.front(); CGAL_assertion(nd!=this->mmap->null_dart_handle); mto_treat.pop(); this->mprev_op = OP_POP; } else { this->mprev_op = OP_END; } } this->set_current_dart(nd); return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } protected: /// Queue of darts to process. std::queue mto_treat; /// Index of the used mark. size_type mmark_number; }; //**************************************************************************** // 0-Cell iterator in combinatorial map of dimension d template class CMap_dart_iterator_basic_of_cell: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_cell Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart), mmark_number(amark) { if (adart!=this->mmap->null_handle) { this->mmap->mark(adart, mmark_number); this->mmap->mark_null_dart(mmark_number); } } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != Map::INVALID_MARK); Base::rewind(); mto_treat = std::queue(); this->mmap->mark((*this), mmark_number); this->mmap->mark_null_dart(mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != Map::INVALID_MARK); CGAL_assertion(this->cont()); Dart_handle nd = this->mmap->null_handle; for ( unsigned int k=2; k<=d; ++k ) { if ( this->is_unmarked2((*this), 0, k, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, 0, k); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETA0I; } else { mto_treat.push(this->mmap->beta(*this, 0, k)); } this->mmap->mark(this->mmap->beta(*this, 0, k), mmark_number); } if ( this->is_unmarked2((*this), k, 1, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, k, 1); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETAI1; } else { mto_treat.push(this->mmap->beta(*this, k, 1)); } this->mmap->mark(this->mmap->beta(*this, k, 1), mmark_number); } for ( unsigned int l=k+1; l<=d; ++l ) { if ( this->is_unmarked2((*this), k, l, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, k, l); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETAIJ; } else { mto_treat.push(this->mmap->beta(*this, k, l)); } this->mmap->mark(this->mmap->beta(*this, k, l), mmark_number); } if ( this->is_unmarked2((*this), l, k, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, l, k); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETAJI; } else { mto_treat.push(this->mmap->beta(*this, l, k)); } this->mmap->mark(this->mmap->beta(*this, l, k), mmark_number); } } } if (nd == this->mmap->null_handle) { if (!mto_treat.empty()) { nd = mto_treat.front(); CGAL_assertion(nd!=this->mmap->null_dart_handle); mto_treat.pop(); this->mprev_op = OP_POP; } else { this->mprev_op = OP_END; } } this->set_current_dart(nd); return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } protected: /// Queue of darts to process. std::queue mto_treat; /// Index of the used mark. size_type mmark_number; }; //**************************************************************************** // Specialization for edge in 2D template class CMap_dart_iterator_basic_of_cell: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_cell Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} }; //**************************************************************************** // Specialization for facet in 2D template class CMap_dart_iterator_basic_of_cell: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_cell Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} }; //**************************************************************************** // Specialization for cc in 2D template class CMap_dart_iterator_basic_of_cell: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_cell Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; //**************************************************************************** // Specialization for edge in 3D template class CMap_dart_iterator_basic_of_cell: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_cell Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} }; //**************************************************************************** // Specialization for facet in 3D template class CMap_dart_iterator_basic_of_cell: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_cell Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} }; //**************************************************************************** // Specialization for volume in 3D template class CMap_dart_iterator_basic_of_cell: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_cell Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; //**************************************************************************** // Specialization for cc in 3D template class CMap_dart_iterator_basic_of_cell: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_cell Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_cell: to iterate onto the * darts of the orbit vertex in 2D. */ template class CMap_dart_iterator_basic_of_cell: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_cell Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart): Base(amap, adart), mfirst_dir(true) {} /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart), mfirst_dir(true) {} /// Rewind of the iterator to its beginning. void rewind() { Base::rewind(); mfirst_dir = true; } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if (mfirst_dir) { this->set_current_dart(this->mmap->beta(*this, 0, 2)); if ((*this)==this->mmap->null_dart_handle) { mfirst_dir = false; this->set_current_dart(this->mmap->beta(this->mfirst_dart, 2, 1)); if ((*this)==this->mmap->null_dart_handle) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else { this->mprev_op = OP_BETAI1; } } else { if ((*this)==this->mfirst_dart) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else this->mprev_op = OP_BETA0I; } } else { this->set_current_dart(this->mmap->beta(*this, 2, 1)); if ((*this) == this->mmap->null_dart_handle) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else this->mprev_op = OP_BETA21; } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } protected: /// Boolean: true iff we turn in the first direction (i.e. using beta02). bool mfirst_dir; }; //**************************************************************************** //*************************ITERATORS*NON*BASIC******************************** //**************************************************************************** //**************************************************************************** #ifndef CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES template class CMap_dart_iterator_of_orbit_generic: public CMap_non_basic_iterator > { public: typedef CMap_dart_iterator_of_orbit_generic Self; typedef CMap_non_basic_iterator > Base; typedef typename Base::Map Map; typedef typename Base::Dart_handle Dart_handle; /// Main constructor. CMap_dart_iterator_of_orbit_generic(Map& amap, Dart_handle adart1): Base(amap, adart1) {} }; //**************************************************************************** template class CMap_dart_iterator_of_orbit: public CMap_dart_iterator_of_orbit_generic { public: typedef CMap_dart_iterator_of_orbit Self; typedef CMap_dart_iterator_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; /// Main constructor. CMap_dart_iterator_of_orbit(Map_& amap, Dart_handle adart): Base(amap, adart) {} }; #else //**************************************************************************** template class CMap_dart_iterator_of_orbit_generic: public CMap_non_basic_iterator::type> { public: typedef CMap_dart_iterator_of_orbit_generic Self; typedef CMap_non_basic_iterator::type> Base; typedef typename Base::Map Map; typedef typename Base::Dart_handle Dart_handle; /// Main constructor. CMap_dart_iterator_of_orbit_generic(Map& amap, Dart_handle adart1): Base(amap, adart1) {} }; //**************************************************************************** template class CMap_dart_iterator_of_orbit: public CMap_dart_iterator_of_orbit_generic { public: typedef CMap_dart_iterator_of_orbit Self; typedef CMap_dart_iterator_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; /// Main constructor. CMap_dart_iterator_of_orbit(Map& amap, Dart_handle adart): Base(amap, adart) {} }; #endif // CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES //**************************************************************************** template class CMap_dart_iterator_of_cell: public CMap_non_basic_iterator > { public: typedef CMap_dart_iterator_basic_of_cell Self; typedef CMap_non_basic_iterator > Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; /// Main constructor. CMap_dart_iterator_of_cell(Map& amap, Dart_handle adart1): Base(amap, adart1) {} }; //**************************************************************************** //********************ITERATOR*INVOLUTION************************************* //**************************************************************************** // i-involution iterator in combinatorial map of dimension d, // 2 class CMap_dart_iterator_basic_of_involution; template class CMap_dart_iterator_basic_of_involution: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_involution Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart), mmark_number(amark) { CGAL_assertion( d>=3 && d<=Map::dimension ); CGAL_assertion( i>=3 && i<=Map::dimension ); if (adart!=this->mmap->null_handle) { this->mmap->mark(adart, mmark_number); this->mmap->mark_null_dart(mmark_number); } } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != Map::INVALID_MARK); Base::rewind(); mto_treat = std::queue(); this->mmap->mark((*this), mmark_number); this->mmap->mark_null_dart(mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != Map::INVALID_MARK); CGAL_assertion(this->cont()); Dart_handle nd = this->mmap->null_handle; for ( int k=0; k<2; ++k ) { if ( this->is_unmarked((*this), k, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, k); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETAI; } else { mto_treat.push(this->mmap->beta(*this, k)); } this->mmap->mark(this->mmap->beta(*this, k), mmark_number); } } for ( int k=2; k<=d; ++k ) { if ( k!=i-1 && k!=i && k!=i+1 && this->is_unmarked((*this), k, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, k); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETAI; } else { mto_treat.push(this->mmap->beta(*this, k)); } this->mmap->mark(this->mmap->beta(*this, k), mmark_number); } } if (nd == this->mmap->null_handle) { if (!mto_treat.empty()) { nd = mto_treat.front(); mto_treat.pop(); this->mprev_op = OP_POP; } else { this->mprev_op = OP_END; } } this->set_current_dart(nd); return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } protected: /// Queue of darts to process. std::queue mto_treat; /// Index of the used mark. size_type mmark_number; }; //**************************************************************************** // i-involution iterator in combinatorial map of dimension d, // 2 class CMap_dart_iterator_basic_of_involution_inv: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_involution_inv Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart), mmark_number(amark) { CGAL_assertion( i>=3 && i<=Map::dimension ); if (adart!=this->mmap->null_handle) { this->mmap->mark(adart, mmark_number); this->mmap->mark_null_dart(mmark_number); } } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != Map::INVALID_MARK); Base::rewind(); mto_treat = std::queue(); this->mmap->mark((*this), mmark_number); this->mmap->mark_null_dart(mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != Map::INVALID_MARK); CGAL_assertion(this->cont()); Dart_handle nd = this->mmap->null_handle; for ( int k=1; k>=0; --k ) { if ( this->is_unmarked((*this), k, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, k); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETAI; } else { mto_treat.push(this->mmap->beta(*this, k)); } this->mmap->mark(this->mmap->beta(*this, k), mmark_number); } } for ( int k=2; k<=d; ++k ) { if ( k!=i-1 && k!=i && k!=i+1 && this->is_unmarked((*this), k, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, k); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETAI; } else { mto_treat.push(this->mmap->beta(*this, k)); } this->mmap->mark(this->mmap->beta(*this, k), mmark_number); } } if (nd == this->mmap->null_handle) { if (!mto_treat.empty()) { nd = mto_treat.front(); mto_treat.pop(); this->mprev_op = OP_POP; } else { this->mprev_op = OP_END; } } this->set_current_dart(nd); return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } protected: /// Queue of darts to process. std::queue mto_treat; /// Index of the used mark. size_type mmark_number; }; //**************************************************************************** // 1-involution iterator in combinatorial map of dimension d. // Iterate by using all beta between 3 and d. template class CMap_dart_iterator_basic_of_involution: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_involution Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart), mmark_number(amark) { if (adart!=this->mmap->null_handle) { this->mmap->mark(adart, mmark_number); this->mmap->mark_null_dart(mmark_number); } } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != Map::INVALID_MARK); Base::rewind(); mto_treat = std::queue(); this->mmap->mark_null_dart(mmark_number); this->mmap->mark((*this), mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != Map::INVALID_MARK); CGAL_assertion(this->cont()); Dart_handle nd = this->mmap->null_handle; for ( unsigned int k=3; k<=d; ++k ) { if ( this->is_unmarked((*this), k, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, k); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETAI; } else { mto_treat.push(this->mmap->beta(*this, k)); } this->mmap->mark(this->mmap->beta(*this, k), mmark_number); } } if (nd == this->mmap->null_handle) { if (!mto_treat.empty()) { nd = mto_treat.front(); mto_treat.pop(); this->mprev_op = OP_POP; } else { this->mprev_op = OP_END; } } this->set_current_dart(nd); return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } protected: /// Queue of darts to process. std::queue mto_treat; /// Index of the used mark. size_type mmark_number; }; //**************************************************************************** // 1-involution iterator in combinatorial map of dimension d. // Iterate by using all beta between 3 and d. template class CMap_dart_iterator_basic_of_involution_inv: public CMap_dart_iterator_basic_of_involution { public: typedef CMap_dart_iterator_basic_of_involution_inv Self; typedef CMap_dart_iterator_basic_of_involution Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart,amark) {} }; //**************************************************************************** // 2-involution iterator in combinatorial map of dimension d. // Iterate by using all beta between 4 and d. template class CMap_dart_iterator_basic_of_involution: public CMap_dart_iterator { public: typedef CMap_dart_iterator_basic_of_involution Self; typedef CMap_dart_iterator Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart), mmark_number(amark) { if ( adart!=this->mmap->null_handle) { this->mmap->mark(adart, mmark_number); this->mmap->mark_null_dart(mmark_number); } } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != Map::INVALID_MARK); Base::rewind(); mto_treat = std::queue(); this->mmap->mark((*this), mmark_number); this->mmap->mark_null_dart(mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != Map::INVALID_MARK); CGAL_assertion(this->cont()); Dart_handle nd = this->mmap->null_handle; for ( unsigned int k=4; k<=d; ++k ) { if ( this->is_unmarked((*this), k, mmark_number) ) { if (nd == this->mmap->null_handle) { nd = this->mmap->beta(*this, k); CGAL_assertion(nd!=this->mmap->null_dart_handle); this->mprev_op = OP_BETAI; } else { mto_treat.push(this->mmap->beta(*this, k)); } this->mmap->mark(this->mmap->beta(*this, k), mmark_number); } } if (nd == this->mmap->null_handle) { if (!mto_treat.empty()) { nd = mto_treat.front(); mto_treat.pop(); this->mprev_op = OP_POP; } else { this->mprev_op = OP_END; } } this->set_current_dart(nd); return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } protected: /// Queue of darts to process. std::queue mto_treat; /// Index of the used mark. size_type mmark_number; }; //**************************************************************************** // 2-involution iterator in combinatorial map of dimension d. // Iterate by using all beta between 4 and d. template class CMap_dart_iterator_basic_of_involution_inv: public CMap_dart_iterator_basic_of_involution { public: typedef CMap_dart_iterator_basic_of_involution_inv Self; typedef CMap_dart_iterator_basic_of_involution Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart,amark) {} }; //**************************************************************************** // 1-involution iterator in combinatorial map of dimension 2. // Empty iterator. template class CMap_dart_iterator_basic_of_involution: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_involution Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 1-involution iterator in combinatorial map of dimension 2. // self iterator. template class CMap_dart_iterator_basic_of_involution_inv: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_involution_inv Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 2-involution iterator in combinatorial map of dimension 2. // self iterator. template class CMap_dart_iterator_basic_of_involution: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_involution Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 2-involution iterator in combinatorial map of dimension 2. // self iterator. template class CMap_dart_iterator_basic_of_involution_inv: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_involution_inv Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 1-involution iterator in combinatorial map of dimension 3. // Beta3 iterator. template class CMap_dart_iterator_basic_of_involution: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_involution Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 1-involution iterator in combinatorial map of dimension 3. // Beta3 iterator. template class CMap_dart_iterator_basic_of_involution_inv: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_involution_inv Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 2-involution iterator in combinatorial map of dimension 3. // Self iterator. template class CMap_dart_iterator_basic_of_involution: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_involution Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type /* amark*/): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 2-involution iterator in combinatorial map of dimension 3. // Self iterator. template class CMap_dart_iterator_basic_of_involution_inv: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_involution_inv Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 1-involution iterator in combinatorial map of dimension 3. // Beta1 iterator. template class CMap_dart_iterator_basic_of_involution: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_involution Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 1-involution iterator in combinatorial map of dimension 3. // Beta0 iterator. template class CMap_dart_iterator_basic_of_involution_inv: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_involution_inv Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_false Use_mark; /// True iff this iterator is basic typedef Tag_true Basic_iterator; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** template class CMap_dart_iterator_of_involution: public CMap_non_basic_iterator > { public: typedef CMap_dart_iterator_of_involution Self; typedef CMap_non_basic_iterator > Base; /// Main constructor. CMap_dart_iterator_of_involution(typename Base::Map& amap, typename Base::Dart_handle adart1): Base(amap, adart1) {} }; //**************************************************************************** template class CMap_dart_iterator_of_involution_inv: public CMap_non_basic_iterator > { public: typedef CMap_dart_iterator_of_involution_inv Self; typedef CMap_non_basic_iterator > Base; /// Main constructor. CMap_dart_iterator_of_involution_inv(typename Base::Map& amap, typename Base::Dart_handle adart1): Base(amap, adart1) {} }; //**************************************************************************** } // namespace CGAL //****************************************************************************** #endif // CGAL_DART_ITERATORS_HH //******************************************************************************