// 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; version 2.1 of the License. // See the file LICENSE.LGPL distributed with CGAL. // // 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$ // // 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_of_orbit * - CMap_dart_iterator_of_cell * - CMap_dart_iterator_basic_of_involution * - CMap_dart_iterator_of_involution * - CMap_dart_iterator_basic_of_involution_inv * - CMap_dart_iterator_of_involution_inv * but many specializations to optimize specific cases. * */ //**************************************************************************** /// OperationState: type to keep the last operation used by the previous ++. typedef char OperationState; /// Enum of all the possible operations used by the ++ operator. enum { OP_NONE = -1, ///< Beginning of the iterator (there is not yet operator++). OP_BETAI, ///< Previous op was the first beta. OP_BETAI_INV, ///< Previous op was the inverse of the first beta. OP_BETAJ, ///< Previous op was the second beta. OP_BETAK, ///< Previous op was the third beta. OP_BETA0I, ///< Previous op was beta0 o the first beta. OP_BETAI1, ///< Previous op was the first beta o beta1. OP_BETAIJ, ///< Previous op was the composition of two beta. OP_BETAJI, ///< Previous op was the composition of two beta. OP_BETA21, ///< Previous op was beta21. OP_JUMP, ///< Previous op was a jump . OP_POP, ///< Previous op pop a dart from a stack or a queue. OP_END ///< Previous op go out of the iterator. }; //**************************************************************************** //**************************************************************************** /** Generic class of iterator onto darts. * Class CMap_dart_iterator is a pure virtual generic iterator. This * class defines what is an iterator. All the iterator classes inherit * from this class. */ template < typename Map_,bool Const=false > class CMap_dart_iterator: public internal::CC_iterator { public: typedef CMap_dart_iterator Self; typedef internal::CC_iterator Base; typedef Base Dart_handle; typedef typename boost::mpl::if_c< Const, const Map_, Map_>::type Map; typedef std::input_iterator_tag iterator_category; typedef typename Base::value_type value_type; typedef typename Base::difference_type difference_type; typedef typename Base::pointer pointer; typedef typename Base::reference reference; public: /// Main constructor. CMap_dart_iterator(Map& amap, Dart_handle adart): Base(adart), mmap(&amap), mfirst_dart(adart), mprev_op(OP_NONE) {} /// == operator. bool operator==(const Self& aiterator) const { return ( ((*this==NULL) && (aiterator==NULL)) || (mfirst_dart == aiterator.mfirst_dart && ((const Base&)*this==(const Base&)aiterator)) ); } /// != operator. bool operator!=(const Self& aiterator) const { return !operator==(aiterator); } /// Accessor to the initial dart of the iterator. Dart_handle get_first_dart() const { return mfirst_dart; } /// Accessor to the combinatorial map. Map* get_combinatorial_map() const { return mmap; } /// Rewind of the iterator to its beginning. void rewind() { set_current_dart(mfirst_dart); mprev_op = OP_NONE; } /// Test if the iterator is at its end. bool cont() const { return *this != NULL; } /// Get the previous operation used for the last ++. OperationState prev_operation() const { return mprev_op; } /// Return true iff this iterator is basic static bool is_basic_iterator() { return true; } protected: /// Set the current dart to a given dart void set_current_dart(Dart_handle adart) { Base::operator=(adart); } private: /// operator -- in private to invalidate the base operator. Self& operator--() { return *this; } /// operator -- in private to invalidate the base operator. void operator--(int) {} protected: /// test if adart->beta(ai) exists and is not marked for amark bool is_unmarked(Dart_handle adart, unsigned int ai, unsigned amark) const { return !adart->is_free(ai) && !mmap->is_marked(adart->beta(ai), amark); } /// test if adart->beta(ai)->beta(aj) exists bool exist_betaij(Dart_handle adart, unsigned int ai, unsigned int aj) const { return !adart->is_free(ai) && !adart->beta(ai)->is_free(aj); } /// test if adart->beta(ai)->beta(aj) exists and is not marked for amark bool is_unmarked2(Dart_handle adart, unsigned int ai, unsigned int aj, unsigned amark) const { return exist_betaij(adart,ai,aj) && !mmap->is_marked(adart->beta(ai)->beta(aj), amark); } protected: /// The map containing the darts to iterate on. Map* mmap; /// The initial dart of the iterator. Dart_handle mfirst_dart; /// The last operation used for the ++ operator. OperationState mprev_op; }; //**************************************************************************** //**********************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; }; template class CMap_dart_iterator_basic_of_orbit_generic: public Get_CMap_dart_iterator_basic_of_orbit::type { public: typedef typename Get_CMap_dart_iterator_basic_of_orbit::type Self; typedef typename Get_CMap_dart_iterator_basic_of_orbit::type Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, int amark): Base(amap, adart, amark) { CGAL_assertion( B1>=0 && B1<=Map::dimension ); if (adart!=NULL) { if (!adart->is_free(B1) && !this->mmap->is_marked(adart->beta(B1), this->mmark_number)) this->mto_treat.push(adart->beta(B1)); } } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(this->mmark_number != -1); Base::rewind(); if (!(*this)->is_free(B1) && !this->mmap->is_marked((*this)->beta(B1), this->mmark_number)) this->mto_treat.push((*this)->beta(B1)); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); Base::operator++(); if (this->cont()) { if (!(*this)->is_free(B1) && !this->mmap->is_marked((*this)->beta(B1), this->mmark_number)) this->mto_treat.push((*this)->beta(B1)); } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } }; #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 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, int /*amark*/): Base(amap, adart) {} /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); this->set_current_dart(NULL); 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 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, int /*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)->is_free(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)->is_free(0)); this->set_current_dart((*this)->beta(0)); if ((*this)==this->mfirst_dart) { this->set_current_dart(NULL); this->mprev_op = OP_END; } } else { if ((*this)->is_free(1)) { this->set_current_dart(NULL); this->mprev_op = OP_END; } else { this->set_current_dart((*this)->beta(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 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, int /*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)->is_free(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)->is_free(1)); this->set_current_dart((*this)->beta(1)); if ((*this)==this->mfirst_dart) { this->set_current_dart(NULL); this->mprev_op = OP_END; } } else { if ((*this)->is_free(0)) { this->set_current_dart(NULL); this->mprev_op = OP_END; } else { this->set_current_dart((*this)->beta(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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart): Base(amap, adart) { CGAL_assertion( Bi>=2 && Bi<=Map::dimension ); } /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, int /*amark*/): Base(amap, adart) { CGAL_assertion( Bi>=2 && Bi<=Map::dimension ); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if ((*this)!=this->mfirst_dart || (*this)->is_free(Bi)) { this->set_current_dart(NULL); this->mprev_op = OP_END; } else { this->set_current_dart((*this)->beta(Bi)); this->mprev_op = OP_BETAI; } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } }; //**************************************************************************** /* Class CMap_extend_iterator which extend a given iterator by * adding Bi and by using a stack and a mark. */ template class CMap_extend_iterator: public Ite { public: typedef CMap_extend_iterator Self; typedef Ite Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef Tag_true Use_mark; public: /// Main constructor. CMap_extend_iterator(Map& amap, Dart_handle adart, int amark): Base(amap, adart), mmark_number(amark), minitial_dart(adart) { if ( adart!=NULL ) { this->mmap->mark(adart, mmark_number); if (!(*this)->is_free(Bi)) mto_treat.push((*this)->beta(Bi)); } } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != -1); Base::operator= ( Base(*this->mmap,minitial_dart) ); mto_treat = std::queue(); this->mmap->mark((*this), mmark_number); if (!(*this)->is_free(Bi)) mto_treat.push((*this)->beta(Bi)); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != -1); CGAL_assertion(this->cont()); Base::operator++(); if ( !this->cont() ) { if ( !mto_treat.empty() ) { Dart_handle res=NULL; do { res = mto_treat.front(); mto_treat.pop(); } while (!mto_treat.empty() && this->mmap->is_marked(res, mmark_number)); if (!this->mmap->is_marked(res, mmark_number)) { Base::operator= ( Base(*this->mmap,res) ); this->mprev_op = OP_POP; } } } if ( this->cont() ) { CGAL_assertion( !this->mmap->is_marked((*this), mmark_number) ); this->mmap->mark((*this), mmark_number); if (!(*this)->is_free(Bi) && !this->mmap->is_marked((*this)->beta(Bi), mmark_number)) mto_treat.push((*this)->beta(Bi)); } 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. int mmark_number; /// Initial dart Dart_handle minitial_dart; }; //**************************************************************************** /* 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_extend_iterator, Bj> { public: typedef CMap_dart_iterator_basic_of_orbit_generic Self; typedef CMap_extend_iterator, Bj> Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, int amark): Base(amap, adart, amark) { CGAL_assertion( Bi: to iterate onto the * darts of the orbit (i.e. orbit facet in 3D). * Specialized here since we do not need queue nor mark. */ 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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart): Base(amap, adart), mit(amap, adart), mexist_beta3(false), mprev_beta3(false), mfirst_border(true) { if (adart!=NULL) mexist_beta3=!adart->is_free(3); } /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, int /*amark*/): Base(amap, adart), mit(amap, adart), mexist_beta3(false), mprev_beta3(false), mfirst_border(true) { if (adart!=NULL) mexist_beta3=!adart->is_free(3); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if (mexist_beta3 && !mprev_beta3) { mprev_beta3 = true; mfirst_border = ! mfirst_border; this->set_current_dart((*this)->beta(3)); this->mprev_op = OP_BETAJ; } else { mprev_beta3 = false; ++mit; this->mprev_op = mit.prev_operation(); if ( !mit.cont() ) this->set_current_dart(NULL); else { if ( !mfirst_border ) this->set_current_dart(mit->beta(3)); 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_beta3 = 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_beta3; /// Boolean: true iff the last ++ used beta3. bool mprev_beta3; /// Boolean: true iff the current dart is on the first border. bool mfirst_border; }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_orbit: to iterate onto the * darts of the orbit (i.e. orbit facet in 3D). * Specialized here since we do not need queue nor mark. */ 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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart): Base(amap, adart), mit(amap, adart), mexist_beta3(false), mprev_beta3(false), mfirst_border(true) { if (adart!=NULL) mexist_beta3=!adart->is_free(3); } /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, int /*amark*/): Base(amap, adart), mit(amap, adart), mexist_beta3(false), mprev_beta3(false), mfirst_border(true) { if (adart!=NULL) mexist_beta3=!adart->is_free(3); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if (mexist_beta3 && !mprev_beta3) { mprev_beta3 = true; mfirst_border = ! mfirst_border; this->set_current_dart((*this)->beta(3)); this->mprev_op = OP_BETAJ; } else { mprev_beta3 = false; ++mit; this->mprev_op = mit.prev_operation(); if ( !mit.cont() ) this->set_current_dart(NULL); else { if ( !mfirst_border ) this->set_current_dart(mit->beta(3)); 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_beta3 = 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_beta3; /// Boolean: true iff the last ++ used beta3. bool mprev_beta3; /// Boolean: true iff the current dart is on the first border. bool mfirst_border; }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_orbit: to iterate onto the * darts of the orbit (i.e. orbit edge in 3D). */ 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 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), mnext_try_beta2(true) {} /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, int /*amark*/): Base(amap, adart), mfirst_dir(true), mnext_try_beta2(true) {} /// Rewind of the iterator to its beginning. void rewind() { Base::rewind(); mfirst_dir = true; mnext_try_beta2 = true; } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if (mfirst_dir) { if (mnext_try_beta2) { if ((*this)->is_free(2)) { mfirst_dir = false; if (this->mfirst_dart->is_free(3)) { this->mprev_op = OP_END; this->set_current_dart(NULL); } else { this->set_current_dart(this->mfirst_dart->beta(3)); this->mprev_op = OP_JUMP; } } else { this->set_current_dart((*this)->beta(2)); mnext_try_beta2 = false; this->mprev_op = OP_BETAI; } } else { if ((*this)->is_free(3)) { mfirst_dir = false; if (this->mfirst_dart->is_free(3)) { this->mprev_op = OP_END; this->set_current_dart(NULL); } else { this->set_current_dart(this->mfirst_dart->beta(3)); mnext_try_beta2 = true; this->mprev_op = OP_JUMP; } } else { this->set_current_dart((*this)->beta(3)); if ((*this)==this->mfirst_dart) { this->mprev_op = OP_END; this->set_current_dart(NULL); } else { mnext_try_beta2 = true; this->mprev_op = OP_BETAJ; } } } } else { if (mnext_try_beta2) { if ((*this)->is_free(2)) { this->mprev_op = OP_END; this->set_current_dart(NULL); } else { this->set_current_dart((*this)->beta(2)); mnext_try_beta2 = false; this->mprev_op = OP_BETAI; } } else { if ((*this)->is_free(3)) { this->mprev_op = OP_END; this->set_current_dart(NULL); } else { this->set_current_dart((*this)->beta(3)); mnext_try_beta2 = 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 beta2). bool mfirst_dir; /// Boolean: true iff the next ++ must use beta2. bool mnext_try_beta2; }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_orbit: to iterate onto * the darts of the orbit , Bi, , which are specific cases. */ template class CMap_dart_iterator_basic_of_orbit_generic: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_orbit_generic Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, int amark): Base(amap, adart, amark) { CGAL_assertion( Biis_free(Bk) && !this->mmap->is_marked(adart->beta(Bk), this->mmark_number)) this->mto_treat.push(adart->beta(Bk)); } } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(this->mmark_number != -1); Base::rewind(); if (!(*this)->is_free(Bk) && !this->mmap->is_marked((*this)->beta(Bk), this->mmark_number)) this->mto_treat.push((*this)->beta(Bk)); } /// Prefix ++ operator. Self& operator++() { Base::operator++(); if ( this->cont() ) { if (!(*this)->is_free(Bk) && !this->mmap->is_marked((*this)->beta(Bk), this->mmark_number)) this->mto_treat.push((*this)->beta(Bk)); } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } }; //**************************************************************************** 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 Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, int amark): Base(amap, adart, amark) { CGAL_assertion( Bi<3 && 3 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; /// 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,int 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; /// 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,int amark): Base(amap,adart,amark) {} }; #endif // CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES //**************************************************************************** // 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 Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, int amark): Base(amap, adart), mmark_number(amark) { CGAL_assertion( i>=2 && i<=Map::dimension+1 ); if (adart!=NULL) this->mmap->mark(adart, mmark_number); } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != -1); Base::rewind(); mto_treat = std::queue(); this->mmap->mark(*this, mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != -1); CGAL_assertion(this->cont()); Dart_handle nd = NULL; for ( unsigned int k=0; k<=d; ++k ) { if ( k!=i && this->is_unmarked((*this), k, mmark_number) ) { if (nd == NULL) { nd = (*this)->beta(k); CGAL_assertion(nd!=Map::null_dart_handle); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_BETAI; } else { mto_treat.push((*this)->beta(k)); this->mmap->mark((*this)->beta(k), mmark_number); } } } if (nd == NULL) { 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(NULL); } } 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. int 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 Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, int amark): Base(amap, adart), mmark_number(amark) { if (adart!=NULL) this->mmap->mark(adart, mmark_number); } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != -1); Base::rewind(); mto_treat = std::queue(); this->mmap->mark((*this), mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != -1); CGAL_assertion(this->cont()); Dart_handle nd = NULL; for ( unsigned int k=2; k<=d; ++k ) { if ( this->is_unmarked2((*this), 0, k, mmark_number) ) { if (nd == NULL) { nd = (*this)->beta(0)->beta(k); CGAL_assertion(nd!=Map::null_dart_handle); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_BETA0I; } else { mto_treat.push((*this)->beta(0)->beta(k)); this->mmap->mark((*this)->beta(0)->beta(k), mmark_number); } } if ( this->is_unmarked2((*this), k, 1, mmark_number) ) { if (nd == NULL) { nd = (*this)->beta(k)->beta(1); CGAL_assertion(nd!=Map::null_dart_handle); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_BETAI1; } else { mto_treat.push((*this)->beta(k)->beta(1)); this->mmap->mark((*this)->beta(k)->beta(1), mmark_number); } } for ( unsigned int l=k+1; l<=d; ++l ) { if ( this->is_unmarked2((*this), k, l, mmark_number) ) { if (nd == NULL) { nd = (*this)->beta(k)->beta(l); CGAL_assertion(nd!=Map::null_dart_handle); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_BETAIJ; } else { mto_treat.push((*this)->beta(k)->beta(l)); this->mmap->mark((*this)->beta(k)->beta(l), mmark_number); } } if ( this->is_unmarked2((*this), l, k, mmark_number) ) { if (nd == NULL) { nd = (*this)->beta(l)->beta(k); CGAL_assertion(nd!=Map::null_dart_handle); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_BETAJI; } else { mto_treat.push((*this)->beta(l)->beta(k)); this->mmap->mark((*this)->beta(l)->beta(k), mmark_number); } } } } if (nd == NULL) { if (!mto_treat.empty()) { nd = mto_treat.front(); CGAL_assertion(nd!=Map::null_dart_handle); mto_treat.pop(); this->mprev_op = OP_POP; } else { this->mprev_op = OP_END; this->set_current_dart(NULL); } } 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. int mmark_number; }; //**************************************************************************** // 1-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 Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, int amark): Base(amap, adart), mmark_number(amark) { if (adart!=NULL) this->mmap->mark(adart, mmark_number); } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != -1); Base::rewind(); mto_treat = std::queue(); this->mmap->mark((*this), mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != -1); CGAL_assertion(this->cont()); Dart_handle nd = NULL; for ( unsigned int k=2; k<=d; ++k ) { if ( this->is_unmarked((*this), k, mmark_number) ) { if (nd == NULL) { nd = (*this)->beta(k); CGAL_assertion(nd!=Map::null_dart_handle); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_BETAI; } else { mto_treat.push((*this)->beta(k)); this->mmap->mark((*this)->beta(k), mmark_number); } } } if (nd == NULL) { 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. int 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; /// 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, int /*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; /// 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, int /*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; /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, int 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; /// 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, int /*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; /// 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, int /*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; /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, int 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; /// Main constructor. CMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, int 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 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, int /*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)->beta(0)->beta(2)); if ((*this)==Map::null_dart_handle) { mfirst_dir = false; this->set_current_dart(this->mfirst_dart->beta(2)->beta(1)); if ((*this)==Map::null_dart_handle) { this->mprev_op = OP_END; this->set_current_dart(NULL); } else { this->mprev_op = OP_BETAI1; } } else { if ((*this)==this->mfirst_dart) { this->mprev_op = OP_END; this->set_current_dart(NULL); } else this->mprev_op = OP_BETA0I; } } else { this->set_current_dart((*this)->beta(2)->beta(1)); if ((*this) == Map::null_dart_handle) { this->mprev_op = OP_END; this->set_current_dart(NULL); } 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; }; //**************************************************************************** /* 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 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, int /*amark*/): Base(amap, amap.darts().begin()) {} /// 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(NULL); this->mprev_op = OP_END; } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } }; //************************************************************************** /* Generic nD version. Here we are sure that all the bases classes use mark * and queue. */ #ifndef CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES template class CMap_dart_iterator_basic_of_orbit_generic: public CMap_dart_iterator_basic_of_orbit_generic { public: typedef CMap_dart_iterator_basic_of_orbit_generic Self; typedef CMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, int amark): Base(amap, adart, amark) { CGAL_assertion( Bi>=0 && Bi<=Map::dimension ); if (adart!=NULL) { if (!adart->is_free(Bi) && !this->mmap->is_marked(adart->beta(Bi), this->mmark_number)) this->mto_treat.push(adart->beta(Bi)); } } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(this->mmark_number != -1); Base::rewind(); if (!(*this)->is_free(Bi) && !this->mmap->is_marked((*this)->beta(Bi), this->mmark_number)) this->mto_treat.push((*this)->beta(Bi)); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); Base::operator++(); if (this->cont()) { if (!(*this)->is_free(Bi) && !this->mmap->is_marked((*this)->beta(Bi), this->mmark_number)) this->mto_treat.push((*this)->beta(Bi)); } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } }; #endif //CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES //**************************************************************************** //*************************ITERATORS*NON*BASIC********************************* //**************************************************************************** //* Class CMap_non_basic_iterator allows to transform a basic_iterator onto //* a non basic one, depending if the basic iterator uses mark or not. template class CMap_non_basic_iterator; //**************************************************************************** template class CMap_non_basic_iterator: public Basic_iterator { public: typedef CMap_non_basic_iterator Self; typedef typename Basic_iterator::Map Map; typedef typename Basic_iterator::Dart_handle Dart_handle; /// Main constructor. CMap_non_basic_iterator(Map& amap, Dart_handle adart1): Basic_iterator(amap, adart1, amap.get_new_mark()) { CGAL_assertion( Basic_iterator::is_basic_iterator() ); } /// Destructor. ~CMap_non_basic_iterator() { if (this->mmark_number != -1) { unmark_treated_darts(); CGAL_assertion( this->mmap->is_whole_map_unmarked (this->mmark_number) ); this->mmap->free_mark(this->mmark_number); } } /// Copy constructor. CMap_non_basic_iterator(const Self& aiterator): Basic_iterator(aiterator) { this->mmark_number = -1; } /// Assignment operator. Self& operator=(const Self& aiterator) { if (this != &aiterator) { Basic_iterator::operator=(aiterator); this->mmark_number = -1; } return *this; } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(this->mmark_number != -1); unmark_treated_darts(); Basic_iterator::rewind(); } using Basic_iterator::operator++; /// Postfix ++ operator. void operator++(int) { operator ++(); } /// Return true iff this iterator is basic static bool is_basic_iterator() { return false; } protected: /// Unmark all the marked darts during the iterator. void unmark_treated_darts() { CGAL_assertion(this->mmark_number != -1); if (this->mmap->is_whole_map_unmarked(this->mmark_number)) return; this->mmap->negate_mark(this->mmark_number); if (this->mmap->is_whole_map_unmarked(this->mmark_number)) return; Basic_iterator::rewind(); while (this->mmap->number_of_unmarked_darts(this->mmark_number) > 0) this->operator++(); this->mmap->negate_mark(this->mmark_number); CGAL_assertion(this->mmap->is_whole_map_unmarked(this->mmark_number)); } }; //**************************************************************************** template class CMap_non_basic_iterator: public Basic_iterator { public: typedef CMap_non_basic_iterator Self; typedef typename Basic_iterator::Map Map; typedef typename Basic_iterator::Dart_handle Dart_handle; /// Main constructor. CMap_non_basic_iterator(Map& amap, Dart_handle adart): Basic_iterator(amap, adart,-1) {} /// Return true iff this iterator is basic static bool is_basic_iterator() { return false; } }; //**************************************************************************** #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 Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, int amark): Base(amap, adart), mmark_number(amark) { CGAL_assertion( d>=3 && d<=Map::dimension ); CGAL_assertion( i>=3 && i<=Map::dimension ); if (adart!=NULL) this->mmap->mark(adart, mmark_number); } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != -1); Base::rewind(); mto_treat = std::queue(); this->mmap->mark((*this), mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != -1); CGAL_assertion(this->cont()); Dart_handle nd = NULL; for ( unsigned int k=0; k<2; ++k ) { if ( this->is_unmarked((*this), k, mmark_number) ) { if (nd == NULL) { nd = (*this)->beta(k); CGAL_assertion(nd!=Map::null_dart_handle); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_BETAI; } else { mto_treat.push((*this)->beta(k)); this->mmap->mark((*this)->beta(k), mmark_number); } } } for ( unsigned int k=2; k<=d; ++k ) { if ( k!=i-1 && k!=i && k!=i+1 && this->is_unmarked((*this), k, mmark_number) ) { if (nd == NULL) { nd = (*this)->beta(k); CGAL_assertion(nd!=Map::null_dart_handle); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_BETAI; } else { mto_treat.push((*this)->beta(k)); this->mmap->mark((*this)->beta(k), mmark_number); } } } if (nd == NULL) { 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(NULL); } } 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. int 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 Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, int amark): Base(amap, adart), mmark_number(amark) { CGAL_assertion( i>=3 && i<=Map::dimension ); if (adart!=NULL) this->mmap->mark(adart, mmark_number); } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != -1); Base::rewind(); mto_treat = std::queue(); this->mmap->mark((*this), mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != -1); CGAL_assertion(this->cont()); Dart_handle nd = NULL; for ( int k=1; k>=0; --k ) { if ( this->is_unmarked((*this), k, mmark_number) ) { if (nd == NULL) { nd = (*this)->beta(k); CGAL_assertion(nd!=Map::null_dart_handle); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_BETAI; } else { mto_treat.push((*this)->beta(k)); this->mmap->mark((*this)->beta(k), mmark_number); } } } for ( unsigned int k=2; k<=d; ++k ) { if ( k!=i-1 && k!=i && k!=i+1 && this->is_unmarked((*this), k, mmark_number) ) { if (nd == NULL) { nd = (*this)->beta(k); CGAL_assertion(nd!=Map::null_dart_handle); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_BETAI; } else { mto_treat.push((*this)->beta(k)); this->mmap->mark((*this)->beta(k), mmark_number); } } } if (nd == NULL) { 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(NULL); } } 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. int 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 Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, int amark): Base(amap, adart), mmark_number(amark) { if (adart!=NULL) this->mmap->mark(adart, mmark_number); } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != -1); Base::rewind(); mto_treat = std::queue(); this->mmap->mark((*this), mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != -1); CGAL_assertion(this->cont()); Dart_handle nd = NULL; for ( unsigned int k=3; k<=d; ++k ) { if ( this->is_unmarked((*this), k, mmark_number) ) { if (nd == NULL) { nd = (*this)->beta(k); CGAL_assertion(nd!=Map::null_dart_handle); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_BETAI; } else { mto_treat.push((*this)->beta(k)); this->mmap->mark((*this)->beta(k), mmark_number); } } } if (nd == NULL) { 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(NULL); } } 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. int 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 Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, int 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 Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, int amark): Base(amap, adart), mmark_number(amark) { this->mmap->mark(adart, mmark_number); } /// Rewind of the iterator to its beginning. void rewind() { CGAL_assertion(mmark_number != -1); Base::rewind(); mto_treat = std::queue(); this->mmap->mark((*this), mmark_number); } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(mmark_number != -1); CGAL_assertion(this->cont()); Dart_handle nd = NULL; for ( unsigned int k=4; k<=d; ++k ) { if ( this->is_unmarked((*this), k, mmark_number) ) { if (nd == NULL) { nd = (*this)->beta(k); CGAL_assertion(nd!=Map::null_dart_handle); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_BETAI; } else { mto_treat.push((*this)->beta(k)); this->mmap->mark((*this)->beta(k), mmark_number); } } } if (nd == NULL) { 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(NULL); } } 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. int 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 Tag_true Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, int 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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, int /*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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, int /*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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, int /*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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, int /*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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, int /*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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, int /*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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, int /* 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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, int /*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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, int /*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 Tag_false Use_mark; public: /// Main constructor. CMap_dart_iterator_basic_of_involution_inv(Map& amap, Dart_handle adart, int /*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 //******************************************************************************