// Copyright (c) 2016 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_GMAP_DART_ITERATORS_HH #define CGAL_GMAP_DART_ITERATORS_HH 1 #include namespace CGAL { /** @file GMap_dart_iterators.h * Definition of gmap dart iterators. * There are 7 iterators: * - GMap_dart_iterator_basic_of_orbit * - GMap_dart_iterator_basic_of_cell * - GMap_dart_iterator_basic_of_all * - GMap_dart_iterator_basic_of_involution * - GMap_dart_iterator_of_orbit * - GMap_dart_iterator_of_cell * - GMap_dart_iterator_of_involution * but many specializations to optimize specific cases. * */ //**************************************************************************** //**********************BASIC ITERATORS*************************************** //**************************************************************************** /* Class GMap_dart_iterator_basic_of_orbit: to iterate * on the darts of the orbit */ #ifndef CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES template class GMap_dart_iterator_basic_of_orbit_generic; #else template class GMap_dart_iterator_basic_of_orbit_generic; template struct Get_GMap_dart_iterator_basic_of_orbit; template struct Get_GMap_dart_iterator_basic_of_orbit { typedef GMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_GMap_dart_iterator_basic_of_orbit { typedef GMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_GMap_dart_iterator_basic_of_orbit { typedef GMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_GMap_dart_iterator_basic_of_orbit { typedef GMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_GMap_dart_iterator_basic_of_orbit { typedef GMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_GMap_dart_iterator_basic_of_orbit { typedef GMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_GMap_dart_iterator_basic_of_orbit { typedef GMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_GMap_dart_iterator_basic_of_orbit { typedef GMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_GMap_dart_iterator_basic_of_orbit { typedef GMap_dart_iterator_basic_of_orbit_generic type; }; template struct Get_GMap_dart_iterator_basic_of_orbit { typedef GMap_dart_iterator_basic_of_orbit_generic type; }; #endif //CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES //**************************************************************************** // Case when Alpha... is empty: iterator of self template class GMap_dart_iterator_basic_of_orbit_generic: public CMap_dart_iterator { public: typedef GMap_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; ///< True iff this iterator uses mark public: /// Main constructor. GMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Main constructor. GMap_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 GMap_dart_iterator_basic_of_orbit: to iterate * on the darts of the orbit (0<=Ai<=dimension) */ template class GMap_dart_iterator_basic_of_orbit_generic: public CMap_dart_iterator { public: typedef GMap_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; ///< True iff this iterator uses mark CGAL_static_assertion( Ai>=0 && Ai<=Map::dimension ); public: /// Main constructor. GMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Main constructor. GMap_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()); if ((*this)!=this->mfirst_dart || this->mmap->is_free(*this, Ai)) { this->set_current_dart(this->mmap->null_handle); this->mprev_op = OP_END; } else { this->set_current_dart(this->mmap->template alpha(*this)); this->mprev_op = OP_ALPHAI; } return *this; } /// Postfix ++ operator. Self operator++(int) { Self res=*this; operator ++(); return res; } }; //**************************************************************************** /* Class CMap_dart_iterator_basic_of_two_alpha: to iterate * on the darts of the orbit : Ai1 (ie at most 4 darts). * 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_alpha. */ template class GMap_dart_iterator_basic_of_two_alpha : public CMap_dart_iterator { public: typedef GMap_dart_iterator_basic_of_two_alpha 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; ///< True iff this iterator uses mark typedef Tag_true Basic_iterator; ///< True iff this iterator is basic CGAL_static_assertion( (0<=Ai && Ai+delta<=Map::dimension && delta>1) ); public: /// Main constructor. GMap_dart_iterator_basic_of_two_alpha(Map& amap, Dart_handle adart): Base(amap, adart), mcurdart(0) {} /// Main constructor. GMap_dart_iterator_basic_of_two_alpha(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->template is_free(*this)) { this->set_current_dart(this->mmap->template alpha(*this)); this->mprev_op = OP_ALPHAI; mcurdart=1; } else { if (!this->mmap->template is_free(*this)) { this->set_current_dart(this->mmap->template alpha(*this)); this->mprev_op = OP_ALPHAJ; mcurdart=3; } else { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } } } else if (mcurdart==1) { if (!this->mmap->template is_free(*this)) { this->set_current_dart(this->mmap->template alpha(*this)); this->mprev_op = OP_ALPHAJ; mcurdart=2; } else { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } } else if (mcurdart==2) { CGAL_assertion(!this->mmap->template is_free(*this)); this->set_current_dart(this->mmap->template alpha(*this)); this->mprev_op = OP_ALPHAI; 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; }; //**************************************************************************** template class GMap_dart_iterator_basic_of_two_alpha; /* Class CMap_dart_iterator_basic_of_two_alpha: to iterate * on the darts of the orbit : Ai class GMap_dart_iterator_basic_of_two_alpha : public CMap_dart_iterator { public: typedef GMap_dart_iterator_basic_of_two_alpha 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; ///< True iff this iterator uses mark typedef Tag_true Basic_iterator; ///< True iff this iterator is basic CGAL_static_assertion(0<=Ai && Ai+1<=Map_::dimension); public: /// Main constructor. GMap_dart_iterator_basic_of_two_alpha(Map& amap, Dart_handle adart): Base(amap, adart), mfirst_dir(true), mnext_try_first_alpha(true) {} /// Main constructor. GMap_dart_iterator_basic_of_two_alpha(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart), mfirst_dir(true), mnext_try_first_alpha(true) {} /// Rewind of the iterator to its beginning. void rewind() { Base::rewind(); mfirst_dir = true; mnext_try_first_alpha = true; } /// Prefix ++ operator. Self& operator++() { CGAL_assertion(this->cont()); if (mfirst_dir) { if (mnext_try_first_alpha) { if (this->mmap->template is_free(*this)) { mfirst_dir = false; if (this->mmap->template is_free(this->mfirst_dart)) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else { this->set_current_dart (this->mmap->template alpha(this->mfirst_dart)); this->mprev_op = OP_JUMP; } } else { this->set_current_dart(this->mmap->template alpha(*this)); mnext_try_first_alpha = false; this->mprev_op = OP_ALPHAI; } } else { if (this->mmap->template is_free(*this)) { mfirst_dir = false; if (this->mmap->template is_free(this->mfirst_dart)) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else { this->set_current_dart (this->mmap->template alpha(this->mfirst_dart)); mnext_try_first_alpha = true; this->mprev_op = OP_JUMP; } } else { this->set_current_dart(this->mmap->template alpha(*this)); if ((*this)==this->mfirst_dart) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else { mnext_try_first_alpha = true; this->mprev_op = OP_ALPHAJ; } } } } else { if (mnext_try_first_alpha) { if (this->mmap->is_free(*this, Ai)) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else { this->set_current_dart(this->mmap->template alpha(*this)); mnext_try_first_alpha = false; this->mprev_op = OP_ALPHAI; } } else { if (this->mmap->template is_free(*this)) { this->mprev_op = OP_END; this->set_current_dart(this->mmap->null_handle); } else { this->set_current_dart(this->mmap->template alpha(*this)); mnext_try_first_alpha = true; this->mprev_op = OP_ALPHAJ; } } } 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 Ai). bool mfirst_dir; /// Boolean: true iff the next ++ must use Ai. bool mnext_try_first_alpha; }; //**************************************************************************** /* Class GMap_dart_iterator_basic_of_orbit: to iterate * on the darts of the orbit : Ai class GMap_dart_iterator_basic_of_orbit_generic: public GMap_dart_iterator_basic_of_two_alpha { public: typedef GMap_dart_iterator_basic_of_orbit_generic Self; typedef GMap_dart_iterator_basic_of_two_alpha Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Basic_iterator; ///< True iff this iterator is basic public: /// Main constructor. GMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart) : Base(amap, adart) {} /// Main constructor. GMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; //**************************************************************************** /// TODO The template specialization with 3 alpha // /* Class CMap_dart_iterator_basic_of_three_alpha: to iterate * on the darts of the orbit : * Ai1 and delta2>1 (ie at most 8 darts). * 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_alpha. */ /* template class GMap_dart_iterator_basic_of_three_alpha : public CMap_dart_iterator { public: typedef GMap_dart_iterator_basic_of_three_alpha 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; ///< True iff this iterator uses mark typedef Tag_true Basic_iterator; ///< True iff this iterator is basic CGAL_static_assertion( (0<=Ai && delta11) ); public: /// Main constructor. GMap_dart_iterator_basic_of_three_alpha(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Main constructor. GMap_dart_iterator_basic_of_three_alpha(Map& amap, Dart_handle adart, size_type): Base(amap, adart) {} }; */ //**************************************************************************** /* Class GMap_dart_iterator_basic_of_orbit: to iterate onto * the darts of the orbit , Ai, , which are specific cases. */ /* template class GMap_dart_iterator_basic_of_orbit_generic: public GMap_extend_iterator, Ak> { public: typedef GMap_dart_iterator_basic_of_orbit_generic Self; typedef GMap_extend_iterator, Ak> Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Basic_iterator; ///< True iff this iterator is basic CGAL_static_assertion( Ai class GMap_dart_iterator_basic_of_orbit_generic: public GMap_extend_iterator, Ai> { public: typedef GMap_dart_iterator_basic_of_orbit_generic Self; typedef GMap_extend_iterator, Ai> Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Basic_iterator; ///< True iff this iterator is basic public: /// Main constructor. GMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; //**************************************************************************** /// Non const basic of orbit iterator template class GMap_dart_iterator_basic_of_orbit: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_orbit Self; typedef GMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Map::Dart_handle Dart_handle; typedef typename Base::Use_mark Use_mark; ///< True iff this iterator uses mark typedef typename Map::size_type size_type; typedef Tag_true Basic_iterator; ///< True iff this iterator is basic /// Main constructor. GMap_dart_iterator_basic_of_orbit(Map& amap,Dart_handle adart): Base(amap,adart) {} /// Main constructor. GMap_dart_iterator_basic_of_orbit(Map& amap,Dart_handle adart,size_type amark): Base(amap,adart,amark) {} }; #else //CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES //**************************************************************************** /// Generic nD version. template class GMap_dart_iterator_basic_of_orbit_generic: public GMap_extend_iterator ::type, A1> { public: typedef GMap_dart_iterator_basic_of_orbit_generic Self; typedef GMap_extend_iterator ::type, A1> Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef typename Map::size_type size_type; typedef Tag_true Basic_iterator; ///< True iff this iterator is basic public: /// Main constructor. GMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Main constructor. GMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; //**************************************************************************** /// Non const basic of orbit iterator template class GMap_dart_iterator_basic_of_orbit: public Get_GMap_dart_iterator_basic_of_orbit::type { public: typedef GMap_dart_iterator_basic_of_orbit Self; typedef typename Get_GMap_dart_iterator_basic_of_orbit::type Base; typedef typename Map::Dart_handle Dart_handle; typedef typename Map::size_type size_type; typedef Tag_true Basic_iterator; ///< True iff this iterator is basic /// Main constructor. GMap_dart_iterator_basic_of_orbit(Map& amap,Dart_handle adart): Base(amap,adart) {} /// Main constructor. GMap_dart_iterator_basic_of_orbit(Map& amap,Dart_handle adart,size_type amark): Base(amap,adart,amark) {} }; #endif // CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES //**************************************************************************** // Generic i-Cell iterator in generalized map of dimension d, // i<=Map::dimension+1 (for i==Map::dimension+1, iterate on the connected // component) template class GMap_dart_iterator_basic_of_cell: public CMap_dart_iterator { public: typedef GMap_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; ///< True iff this iterator uses mark typedef Tag_true Basic_iterator; ///< True iff this iterator is basic CGAL_static_assertion( i>=0 && i<=Map::dimension+1 ); public: /// Main constructor. GMap_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); } /// 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); } /// 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; k<=d; ++k ) { if ( k!=i && !this->mmap->is_free(*this, k) && !this->mmap->is_marked(this->mmap->alpha(*this, k), this->mmark_number) ) { if (nd == this->mmap->null_handle) { CGAL_assertion(!this->mmap->is_free(*this, k)); nd = this->mmap->alpha(*this, k); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_ALPHAI; } else { mto_treat.push(this->mmap->alpha(*this, k)); } this->mmap->mark(this->mmap->alpha(*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; }; //**************************************************************************** // Specialization for vertex in 2D template class GMap_dart_iterator_basic_of_cell: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_cell Self; typedef GMap_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. GMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Main constructor. GMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} }; //**************************************************************************** // Specialization for edge in 2D template class GMap_dart_iterator_basic_of_cell: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_cell Self; typedef GMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef Tag_true Basic_iterator; ///< True iff this iterator is basic typedef typename Map::size_type size_type; /// Main constructor. GMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Main constructor. GMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} }; //**************************************************************************** // Specialization for facet in 2D template class GMap_dart_iterator_basic_of_cell: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_cell Self; typedef GMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef Tag_true Basic_iterator; ///< True iff this iterator is basic typedef typename Map::size_type size_type; /// Main constructor. GMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Main constructor. GMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} }; //**************************************************************************** // Specialization for edge in 3D template class GMap_dart_iterator_basic_of_cell: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_cell Self; typedef GMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef Tag_true Basic_iterator; ///< True iff this iterator is basic typedef typename Map::size_type size_type; /// Main constructor. /// @TODO specialization of iterator /// GMap_dart_iterator_basic_of_orbit_generic /// with 3 non consecutive args /*GMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart): Base(amap, adart) {}*/ /// Main constructor. GMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; //**************************************************************************** // Specialization for facet in 3D template class GMap_dart_iterator_basic_of_cell: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_cell Self; typedef GMap_dart_iterator_basic_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef Tag_true Basic_iterator; ///< True iff this iterator is basic typedef typename Map::size_type size_type; /// Main constructor. /// @TODO specialization of iterator /// GMap_dart_iterator_basic_of_orbit_generic /// with 3 non consecutive args /*GMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart): Base(amap, adart) {}*/ /// Main constructor. GMap_dart_iterator_basic_of_cell(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart, amark) {} }; //**************************************************************************** /* Class GMap_dart_iterator_basic_of_all: to iterate onto all the * darts of the map. */ template class GMap_dart_iterator_basic_of_all: public CMap_dart_iterator { public: typedef GMap_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; ///< True iff this iterator uses mark typedef Tag_true Basic_iterator; ///< True iff this iterator is basic public: /// Main constructor. GMap_dart_iterator_basic_of_all(Map& amap): Base(amap, amap.darts().begin()) {} /// Main constructor. GMap_dart_iterator_basic_of_all(Map& amap, size_type /*amark*/): Base(amap, amap.darts().begin()) {} /// Constructor with a dart in parameter (for end iterator). GMap_dart_iterator_basic_of_all(Map& amap, Dart_handle adart): Base(amap, adart) {} /// Constructor with a dart in parameter (for end iterator). GMap_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; } }; //**************************************************************************** //*************************ITERATORS*NON*BASIC********************************* //**************************************************************************** #ifndef CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES template class GMap_dart_iterator_of_orbit_generic: public CMap_non_basic_iterator > { public: typedef GMap_dart_iterator_of_orbit_generic Self; typedef CMap_non_basic_iterator > Base; typedef typename Base::Map Map; typedef typename Base::Dart_handle Dart_handle; typedef Tag_false Basic_iterator; ///< True iff this iterator is basic /// Main constructor. GMap_dart_iterator_of_orbit_generic(Map& amap, Dart_handle adart1): Base(amap, adart1) {} }; //**************************************************************************** template class GMap_dart_iterator_of_orbit: public GMap_dart_iterator_of_orbit_generic { public: typedef GMap_dart_iterator_of_orbit Self; typedef GMap_dart_iterator_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef Tag_false Basic_iterator; ///< True iff this iterator is basic /// Main constructor. GMap_dart_iterator_of_orbit(Map_& amap, Dart_handle adart): Base(amap, adart) {} }; #else //**************************************************************************** template class GMap_dart_iterator_of_orbit_generic: public CMap_non_basic_iterator::type> { public: typedef GMap_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; typedef Tag_false Basic_iterator; ///< True iff this iterator is basic /// Main constructor. GMap_dart_iterator_of_orbit_generic(Map& amap, Dart_handle adart1): Base(amap, adart1) {} }; //**************************************************************************** template class GMap_dart_iterator_of_orbit: public GMap_dart_iterator_of_orbit_generic { public: typedef GMap_dart_iterator_of_orbit Self; typedef GMap_dart_iterator_of_orbit_generic Base; typedef typename Base::Dart_handle Dart_handle; typedef Tag_false Basic_iterator; ///< True iff this iterator is basic /// Main constructor. GMap_dart_iterator_of_orbit(Map& amap, Dart_handle adart): Base(amap, adart) {} }; #endif // CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES //**************************************************************************** template class GMap_dart_iterator_of_cell: public CMap_non_basic_iterator > { public: typedef GMap_dart_iterator_basic_of_cell Self; typedef CMap_non_basic_iterator > Base; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Map Map; typedef Tag_false Basic_iterator; ///< True iff this iterator is basic /// Main constructor. GMap_dart_iterator_of_cell(Map& amap, Dart_handle adart1): Base(amap, adart1) {} }; //**************************************************************************** //********************ITERATOR*INVOLUTION************************************* //**************************************************************************** // i-involution iterator in combinatorial map of dimension d, // 0 class GMap_dart_iterator_basic_of_involution; template class GMap_dart_iterator_basic_of_involution: public CMap_dart_iterator { public: typedef GMap_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 uses mark typedef Tag_true Basic_iterator; ///< True iff this iterator is basic public: /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type amark): Base(amap, adart), mmark_number(amark) { CGAL_assertion( d<=Map::dimension ); CGAL_assertion( i<=Map::dimension ); if (adart!=this->mmap->null_handle) 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); } /// 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; kmmap->is_free(*this, k) && !this->mmap->is_marked(this->mmap->alpha(*this, k), this->mmark_number) ) { if (nd == this->mmap->null_handle) { CGAL_assertion(!this->mmap->is_free(*this, k)); nd = this->mmap->alpha(*this, k); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_ALPHAI; } else { mto_treat.push(this->mmap->alpha(*this, k)); } this->mmap->mark(this->mmap->alpha(*this, k), mmark_number); } } for ( unsigned int k=i+2; k<=d; ++k ) { if ( !this->mmap->is_free(*this, k) && !this->mmap->is_marked(this->mmap->alpha(*this, k), this->mmark_number) ) { if (nd == this->mmap->null_handle) { CGAL_assertion(!this->mmap->is_free(*this, k)); nd = this->mmap->alpha(*this, k); this->mmap->mark(nd, mmark_number); this->mprev_op = OP_ALPHAI; } else { mto_treat.push(this->mmap->alpha(*this, k)); } this->mmap->mark(this->mmap->alpha(*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; }; //**************************************************************************** // 0-involution iterator in combinatorial map of dimension 2. // Alpha2 iterator. template class GMap_dart_iterator_basic_of_involution: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_involution Self; typedef GMap_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_true Basic_iterator; ///< True iff this iterator is basic public: /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. GMap_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 GMap_dart_iterator_basic_of_involution: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_involution Self; typedef GMap_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_true Basic_iterator; ///< True iff this iterator is basic public: /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 2-involution iterator in combinatorial map of dimension 2. // Alpha0 iterator. template class GMap_dart_iterator_basic_of_involution: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_involution Self; typedef GMap_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_true Basic_iterator; ///< True iff this iterator is basic public: /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 0-involution iterator in combinatorial map of dimension 3. // Alpha2, Alpha3 iterator. template class GMap_dart_iterator_basic_of_involution: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_involution Self; typedef GMap_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_true Basic_iterator; ///< True iff this iterator is basic public: /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 1-involution iterator in combinatorial map of dimension 3. // Alpha3 iterator. template class GMap_dart_iterator_basic_of_involution: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_involution Self; typedef GMap_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_true Basic_iterator; ///< True iff this iterator is basic public: /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 2-involution iterator in combinatorial map of dimension 3. // Alpha0 iterator. template class GMap_dart_iterator_basic_of_involution: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_involution Self; typedef GMap_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_true Basic_iterator; ///< True iff this iterator is basic public: /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type /* amark*/): Base(amap, adart) {} /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** // 3-involution iterator in combinatorial map of dimension 3. // Alpha0, Alpha1 iterator. template class GMap_dart_iterator_basic_of_involution: public GMap_dart_iterator_basic_of_orbit_generic { public: typedef GMap_dart_iterator_basic_of_involution Self; typedef GMap_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_true Basic_iterator; ///< True iff this iterator is basic public: /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart, size_type /*amark*/): Base(amap, adart) {} /// Main constructor. GMap_dart_iterator_basic_of_involution(Map& amap, Dart_handle adart): Base(amap, adart) {} }; //**************************************************************************** template class GMap_dart_iterator_of_involution: public CMap_non_basic_iterator > { public: typedef GMap_dart_iterator_of_involution Self; typedef CMap_non_basic_iterator > Base; /// Main constructor. GMap_dart_iterator_of_involution(typename Base::Map& amap, typename Base::Dart_handle adart1): Base(amap, adart1) {} }; //**************************************************************************** } // namespace CGAL //****************************************************************************** #endif // CGAL_GMAP_DART_ITERATORS_HH //******************************************************************************