diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-01-02 05:55:30 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-01-02 05:55:30 +0400 |
commit | 699da2fb0d9012cef5e45cc1b547a01fd92dbc1c (patch) | |
tree | eb6e3de1f90387af1a2628bbc79d51327e3ac248 /source/blender/freestyle/intern/view_map/ViewMapAdvancedIterators.h | |
parent | 520ab93465d8056bf6d4a4115743daaee4c2fd66 (diff) |
Yet another big style clean-up patch by Bastien Montagne, thanks a lot!
Now the code style is acceptable for the merge now, according to Bastien.
Thanks again Bastien for having this done! :)
Diffstat (limited to 'source/blender/freestyle/intern/view_map/ViewMapAdvancedIterators.h')
-rw-r--r-- | source/blender/freestyle/intern/view_map/ViewMapAdvancedIterators.h | 1464 |
1 files changed, 781 insertions, 683 deletions
diff --git a/source/blender/freestyle/intern/view_map/ViewMapAdvancedIterators.h b/source/blender/freestyle/intern/view_map/ViewMapAdvancedIterators.h index adffc46ec74..ff6557b7d86 100644 --- a/source/blender/freestyle/intern/view_map/ViewMapAdvancedIterators.h +++ b/source/blender/freestyle/intern/view_map/ViewMapAdvancedIterators.h @@ -1,691 +1,789 @@ -// -// Filename : ViewMapAdvancedIterators.h -// Author(s) : Stephane Grabli -// Purpose : Iterators used to iterate over the various elements of the ViewMap -// These iterators can't be exported to python. -// Date of creation : 01/07/2003 -// -/////////////////////////////////////////////////////////////////////////////// - - -// -// Copyright (C) : Please refer to the COPYRIGHT file distributed -// with this source distribution. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef VIEWMAPADVANCEDITERATORS_H -# define VIEWMAPADVANCEDITERATORS_H +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2010 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef __FREESTYLE_VIEW_MAP_ADVANCED_ITERATORS_H__ +#define __FREESTYLE_VIEW_MAP_ADVANCED_ITERATORS_H__ + +/** \file blender/freestyle/intern/view_map/ViewMapAdvancedIterators.h + * \ingroup freestyle + * \brief Iterators used to iterate over the various elements of the ViewMap. + * These iterators can't be exported to python. + * \author Stephane Grabli + * \date 01/07/2003 + */ #include "ViewMap.h" -#include "../system/Iterator.h" //soc - - /**********************************/ - /* */ - /* */ - /* ViewMap */ - /* */ - /* */ - /**********************************/ - - /**********************************/ - /* */ - /* */ - /* ViewVertex */ - /* */ - /* */ - /**********************************/ - -namespace ViewVertexInternal{ - - class edge_const_traits : public Const_traits< ::ViewVertex::directedViewEdge> { - public: - typedef vector< ::ViewVertex::directedViewEdge> edges_container; - typedef edges_container::const_iterator edges_container_iterator ; - typedef vector< ::ViewVertex::directedViewEdge*> edge_pointers_container; - typedef edge_pointers_container::const_iterator edge_pointers_container_iterator ; - }; - class edge_nonconst_traits : public Nonconst_traits< ::ViewVertex::directedViewEdge> { - public: - typedef vector< ::ViewVertex::directedViewEdge> edges_container; - typedef edges_container::iterator edges_container_iterator ; - typedef vector< ::ViewVertex::directedViewEdge*> edge_pointers_container; - typedef edge_pointers_container::iterator edge_pointers_container_iterator ; - }; - + +#include "../system/Iterator.h" //soc + +/**********************************/ +/* */ +/* */ +/* ViewMap */ +/* */ +/* */ +/**********************************/ + +/**********************************/ +/* */ +/* */ +/* ViewVertex */ +/* */ +/* */ +/**********************************/ + +namespace ViewVertexInternal { + +class edge_const_traits : public Const_traits< ::ViewVertex::directedViewEdge> +{ +public: + typedef vector< ::ViewVertex::directedViewEdge> edges_container; + typedef edges_container::const_iterator edges_container_iterator; + typedef vector< ::ViewVertex::directedViewEdge*> edge_pointers_container; + typedef edge_pointers_container::const_iterator edge_pointers_container_iterator; +}; + +class edge_nonconst_traits : public Nonconst_traits< ::ViewVertex::directedViewEdge> +{ +public: + typedef vector< ::ViewVertex::directedViewEdge> edges_container; + typedef edges_container::iterator edges_container_iterator; + typedef vector< ::ViewVertex::directedViewEdge*> edge_pointers_container; + typedef edge_pointers_container::iterator edge_pointers_container_iterator; +}; + template<class Traits> - class edge_iterator_base : public IteratorBase<Traits,InputIteratorTag_Traits> - { - public: - typedef typename Traits::value_type value_type; - typedef typename Traits::difference_type difference_type; - typedef typename Traits::pointer pointer; - typedef typename Traits::reference reference; - typedef edge_iterator_base<Traits> Self; - typedef typename Traits::edges_container_iterator edges_container_iterator; - typedef typename Traits::edge_pointers_container_iterator edge_pointers_container_iterator; - typedef edge_iterator_base<edge_nonconst_traits> iterator; - typedef edge_iterator_base<edge_const_traits> const_iterator; - public: - friend class ViewVertex; - friend class TVertex; - friend class NonTVertex; - friend class ViewEdge; - friend class edge_iterator; - protected: - Nature::VertexNature _Nature; // the nature of the underlying vertex - // T vertex attributes - edge_pointers_container_iterator _tbegin; - edge_pointers_container_iterator _tend; - edge_pointers_container_iterator _tvertex_iter; - - // mutable value_type _tvertex_iter; - // value_type _feA; - // value_type _feB; - // value_type _beA; - // value_type _beB; - - // Non TVertex attributes - edges_container_iterator _begin; - edges_container_iterator _end; - edges_container_iterator _nontvertex_iter; - - typedef IteratorBase<Traits,InputIteratorTag_Traits> parent_class; - - public: - inline edge_iterator_base() : parent_class() {} - inline edge_iterator_base(Nature::VertexNature iNature) - : parent_class() - {_Nature = iNature;} - edge_iterator_base(const edge_iterator_base<edge_nonconst_traits>& iBrother) - : parent_class(iBrother) - { - _Nature = iBrother._Nature; - if(_Nature & Nature::T_VERTEX) - { - // _feA = iBrother._feA; - // _feB = iBrother._feB; - // _beA = iBrother._beA; - // _beB = iBrother._beB; - // _tvertex_iter = iBrother._tvertex_iter; - _tbegin = iBrother._tbegin; - _tend = iBrother._tend; - _tvertex_iter = iBrother._tvertex_iter; - } - else - { - _begin = iBrother._begin; - _end = iBrother._end; - _nontvertex_iter = iBrother._nontvertex_iter; - } - } - edge_iterator_base(const edge_iterator_base<edge_const_traits>& iBrother) - : parent_class(iBrother) - { - _Nature = iBrother._Nature; - if(_Nature & Nature::T_VERTEX) - { - // _feA = iBrother._feA; - // _feB = iBrother._feB; - // _beA = iBrother._beA; - // _beB = iBrother._beB; - // _tvertex_iter = iBrother._tvertex_iter; - _tbegin = iBrother._tbegin; - _tend = iBrother._tend; - _tvertex_iter = iBrother._tvertex_iter; - } - else - { - _begin = iBrother._begin; - _end = iBrother._end; - _nontvertex_iter = iBrother._nontvertex_iter; - } - } - virtual ~edge_iterator_base() {} - //protected://FIXME - public: - // inline edge_iterator_base(value_type ifeA, - // value_type ifeB, - // value_type ibeA, - // value_type ibeB, - // value_type iter) - // : parent_class() - // { - // _Nature = Nature::T_VERTEX; - // _feA = ifeA; - // _feB = ifeB; - // _beA = ibeA; - // _beB = ibeB; - // _tvertex_iter = iter; - // } - inline edge_iterator_base(edge_pointers_container_iterator begin, - edge_pointers_container_iterator end, - edge_pointers_container_iterator iter) - : parent_class() - { - _Nature = Nature::T_VERTEX; - _tbegin = begin; - _tend = end; - _tvertex_iter = iter; - } - inline edge_iterator_base(edges_container_iterator begin, - edges_container_iterator end, - edges_container_iterator iter) - : parent_class() - { - _Nature = Nature::NON_T_VERTEX; - _begin = begin; - _end = end; - _nontvertex_iter = iter; - } - - public: - - - virtual bool begin() const - { - if(_Nature & Nature::T_VERTEX) - return (_tvertex_iter == _tbegin); - //return (_tvertex_iter == _feA); - else - return (_nontvertex_iter == _begin); - } - virtual bool end() const - { - if(_Nature & Nature::T_VERTEX) - //return (_tvertex_iter.first == 0); - return (_tvertex_iter == _tend); - else - return (_nontvertex_iter == _end); - } - - // operators - virtual Self& operator++() // operator corresponding to ++i - { - increment(); - return *this; - } - virtual Self operator++(int) // opérateur correspondant à i++ - { // c.a.d qui renvoie la valeur *puis* incrémente. - Self tmp = *this; // C'est pour cela qu'on stocke la valeur - increment(); // dans un temporaire. - return tmp; - } - - // comparibility - virtual bool operator!=(const Self& b) const - { - if(_Nature & Nature::T_VERTEX) - return (_tvertex_iter != b._tvertex_iter); - else - return (_nontvertex_iter != b._nontvertex_iter); - } - - virtual bool operator==(const Self& b) const - {return !(*this != b);} - - // dereferencing - virtual reference operator*() const - { - if(_Nature & Nature::T_VERTEX) - //return _tvertex_iter; - return **_tvertex_iter; - else - return (*_nontvertex_iter); - } - virtual pointer operator->() const { return &(operator*());} - - protected: - inline void increment() - { - if(_Nature & Nature::T_VERTEX) - { - value_type tmp = (**_tvertex_iter); - ++_tvertex_iter; - value_type tmp2 = (**_tvertex_iter); - if(tmp2.first == tmp.first) - ++_tvertex_iter; - // // Hack to deal with cusp. the result of a cusp - // // is a TVertex having two identical viewedges. - // // In order to iterate properly, we chose to - // // to skip these last ones. - // if(_feB.first == _beA.first) - // { - // if(_feA.first == _beB.first) - // { - // _tvertex_iter.first = 0; - // return; - // } - // - // if(_tvertex_iter.first == _feA.first) - // _tvertex_iter.first = _beB.first; - // else if(_tvertex_iter.first == _beB.first) - // _tvertex_iter.first = 0; - // else - // _tvertex_iter.first = _feA.first; - // return; - // } - // if(_feA.first == _beB.first) - // { - // if(_feB.first == _beA.first) - // { - // _tvertex_iter.first = 0; - // return; - // } - // - // if(_tvertex_iter.first == _feB.first) - // _tvertex_iter.first = _beA.first; - // else if(_tvertex_iter.first == _beA.first) - // _tvertex_iter.first = 0; - // else - // _tvertex_iter.first = _feB.first; - // return; - // } - // // End of hack - // - // if(_tvertex_iter.first == _feA.first){ - // // we return bea or beb - // - // - // // choose one of them - // - // _tvertex_iter.first = _feB.first; - // return; - // } - // if(_tvertex_iter.first == _feB.first) - // { - // _tvertex_iter.first = _beA.first; - // return; - // } - // if(_tvertex_iter.first == _beA.first) - // { - // _tvertex_iter.first = _beB.first; - // return; - // } - // if(_tvertex_iter.first == _beB.first) - // { - // _tvertex_iter.first = 0; - // return; - // } - } - else - ++_nontvertex_iter; - } - }; - - } - /**********************************/ - /* */ - /* */ - /* ViewEdge */ - /* */ - /* */ - /**********************************/ +class edge_iterator_base : public IteratorBase<Traits,InputIteratorTag_Traits> +{ +public: + typedef typename Traits::value_type value_type; + typedef typename Traits::difference_type difference_type; + typedef typename Traits::pointer pointer; + typedef typename Traits::reference reference; + typedef edge_iterator_base<Traits> Self; + typedef typename Traits::edges_container_iterator edges_container_iterator; + typedef typename Traits::edge_pointers_container_iterator edge_pointers_container_iterator; + typedef edge_iterator_base<edge_nonconst_traits> iterator; + typedef edge_iterator_base<edge_const_traits> const_iterator; + +public: + friend class ViewVertex; + friend class TVertex; + friend class NonTVertex; + friend class ViewEdge; + friend class edge_iterator; + +protected: + Nature::VertexNature _Nature; // the nature of the underlying vertex + // T vertex attributes + edge_pointers_container_iterator _tbegin; + edge_pointers_container_iterator _tend; + edge_pointers_container_iterator _tvertex_iter; + +#if 0 + mutable value_type _tvertex_iter; + value_type _feA; + value_type _feB; + value_type _beA; + value_type _beB; +#endif + + // Non TVertex attributes + edges_container_iterator _begin; + edges_container_iterator _end; + edges_container_iterator _nontvertex_iter; + + typedef IteratorBase<Traits,InputIteratorTag_Traits> parent_class; + +public: + inline edge_iterator_base() : parent_class() {} + + inline edge_iterator_base(Nature::VertexNature iNature) : parent_class() + { + _Nature = iNature; + } + + edge_iterator_base(const edge_iterator_base<edge_nonconst_traits>& iBrother) : parent_class(iBrother) + { + _Nature = iBrother._Nature; + if (_Nature & Nature::T_VERTEX) { +#if 0 + _feA = iBrother._feA; + _feB = iBrother._feB; + _beA = iBrother._beA; + _beB = iBrother._beB; + _tvertex_iter = iBrother._tvertex_iter; +#endif + _tbegin = iBrother._tbegin; + _tend = iBrother._tend; + _tvertex_iter = iBrother._tvertex_iter; + } + else { + _begin = iBrother._begin; + _end = iBrother._end; + _nontvertex_iter = iBrother._nontvertex_iter; + } + } + + edge_iterator_base(const edge_iterator_base<edge_const_traits>& iBrother) : parent_class(iBrother) + { + _Nature = iBrother._Nature; + if (_Nature & Nature::T_VERTEX) { +#if 0 + _feA = iBrother._feA; + _feB = iBrother._feB; + _beA = iBrother._beA; + _beB = iBrother._beB; + _tvertex_iter = iBrother._tvertex_iter; +#endif + _tbegin = iBrother._tbegin; + _tend = iBrother._tend; + _tvertex_iter = iBrother._tvertex_iter; + } + else { + _begin = iBrother._begin; + _end = iBrother._end; + _nontvertex_iter = iBrother._nontvertex_iter; + } + } + + virtual ~edge_iterator_base() {} + +//protected://FIXME +public: +#if 0 + inline edge_iterator_base(value_type ifeA, value_type ifeB, value_type ibeA, value_type ibeB, value_type iter) + : parent_class() + { + _Nature = Nature::T_VERTEX; + _feA = ifeA; + _feB = ifeB; + _beA = ibeA; + _beB = ibeB; + _tvertex_iter = iter; + } +#endif + + inline edge_iterator_base(edge_pointers_container_iterator begin, edge_pointers_container_iterator end, + edge_pointers_container_iterator iter) + : parent_class() + { + _Nature = Nature::T_VERTEX; + _tbegin = begin; + _tend = end; + _tvertex_iter = iter; + } + + inline edge_iterator_base(edges_container_iterator begin, edges_container_iterator end, + edges_container_iterator iter) + : parent_class() + { + _Nature = Nature::NON_T_VERTEX; + _begin = begin; + _end = end; + _nontvertex_iter = iter; + } + +public: + virtual bool begin() const + { + if (_Nature & Nature::T_VERTEX) + return (_tvertex_iter == _tbegin); + //return (_tvertex_iter == _feA); + else + return (_nontvertex_iter == _begin); + } + + virtual bool end() const + { + if (_Nature & Nature::T_VERTEX) + //return (_tvertex_iter.first == 0); + return (_tvertex_iter == _tend); + else + return (_nontvertex_iter == _end); + } + + // operators + // operator corresponding to ++i + virtual Self& operator++() + { + increment(); + return *this; + } + + // operator corresponding to i++, i.e. which returns the value *and then* increments it. + // That's why we store the value in a temp. + virtual Self operator++(int) // opérateur correspondant à i++ + { + Self tmp = *this; + increment(); + return tmp; + } + + // comparibility + virtual bool operator!=(const Self& b) const + { + if (_Nature & Nature::T_VERTEX) + return (_tvertex_iter != b._tvertex_iter); + else + return (_nontvertex_iter != b._nontvertex_iter); + } + + virtual bool operator==(const Self& b) const + { + return !(*this != b); + } + + // dereferencing + virtual reference operator*() const + { + if (_Nature & Nature::T_VERTEX) + //return _tvertex_iter; + return **_tvertex_iter; + else + return (*_nontvertex_iter); + } + + virtual pointer operator->() const + { + return &(operator*()); + } + +protected: + inline void increment() + { + if (_Nature & Nature::T_VERTEX) { + value_type tmp = (**_tvertex_iter); + ++_tvertex_iter; + value_type tmp2 = (**_tvertex_iter); + if (tmp2.first == tmp.first) + ++_tvertex_iter; +#if 0 + // Hack to deal with cusp. the result of a cusp is a TVertex having two identical viewedges. + // In order to iterate properly, we chose to to skip these last ones. + if (_feB.first == _beA.first) { + if (_feA.first == _beB.first) { + _tvertex_iter.first = 0; + return; + } + + if (_tvertex_iter.first == _feA.first) + _tvertex_iter.first = _beB.first; + else if (_tvertex_iter.first == _beB.first) + _tvertex_iter.first = 0; + else + _tvertex_iter.first = _feA.first; + return; + } + if (_feA.first == _beB.first) { + if (_feB.first == _beA.first) { + _tvertex_iter.first = 0; + return; + } + + if (_tvertex_iter.first == _feB.first) + _tvertex_iter.first = _beA.first; + else if (_tvertex_iter.first == _beA.first) + _tvertex_iter.first = 0; + else + _tvertex_iter.first = _feB.first; + return; + } + // End of hack + + if (_tvertex_iter.first == _feA.first) { + // we return bea or beb + // choose one of them + _tvertex_iter.first = _feB.first; + return; + } + if (_tvertex_iter.first == _feB.first) { + _tvertex_iter.first = _beA.first; + return; + } + if (_tvertex_iter.first == _beA.first) { + _tvertex_iter.first = _beB.first; + return; + } + if (_tvertex_iter.first == _beB.first) { + _tvertex_iter.first = 0; + return; + } +#endif + } + else { + ++_nontvertex_iter; + } + } +}; + +} // ViewVertexInternal namespace + +/**********************************/ +/* */ +/* */ +/* ViewEdge */ +/* */ +/* */ +/**********************************/ namespace ViewEdgeInternal { - /*!----------------------*/ - /*! Iterators definition */ - /*!----------------------*/ - template<class Traits> - class edge_iterator_base : public IteratorBase<Traits,BidirectionalIteratorTag_Traits> - { - public: - typedef typename Traits::value_type value_type; - typedef typename Traits::difference_type difference_type; - typedef typename Traits::pointer pointer; - typedef typename Traits::reference reference; - typedef edge_iterator_base<Traits> Self; - public: - mutable value_type _ViewEdge; - //friend class edge_iterator_base<Nonconst_traits<ViewEdge*> >; - //friend class edge_iterator_base<Const_traits<ViewEdge*> >; - value_type _first; - bool _orientation; - typedef IteratorBase<Traits,BidirectionalIteratorTag_Traits> parent_class; - - public: - friend class ViewEdge; - inline edge_iterator_base() - : parent_class() - {_orientation=true;_first=0;} - - inline edge_iterator_base(const edge_iterator_base<Nonconst_traits< ::ViewEdge*> >& iBrother) - : parent_class() - { - _ViewEdge = iBrother._ViewEdge; - _first = iBrother._first; - _orientation = iBrother._orientation; - } - - inline edge_iterator_base(const edge_iterator_base<Const_traits< ::ViewEdge*> >& iBrother) - : parent_class() - { - _ViewEdge = iBrother._ViewEdge; - _first = iBrother._first; - _orientation = iBrother._orientation; - } - - //protected://FIXME - public: - inline edge_iterator_base(value_type iEdge, bool orientation = true) - : parent_class() - { - _ViewEdge = iEdge; - _first = iEdge; - _orientation = orientation; - } - - - public: - virtual Self* clone() const - { - return new edge_iterator_base(*this); - } - virtual ~edge_iterator_base() {} - - public: - - virtual bool orientation() {return _orientation;} - virtual void set_edge(value_type iVE) {_ViewEdge=iVE;} - virtual void set_orientation(bool iOrientation) {_orientation = iOrientation;} - virtual void change_orientation() {_orientation = !_orientation;} - - // operators - inline Self& operator++() // operator corresponding to ++i - { - //++_ViewEdge->getTimeStamp(); - increment(); - return *this; - } - inline Self operator++(int) // opérateur correspondant à i++ - { // c.a.d qui renvoie la valeur *puis* incrémente. - //++_ViewEdge->getTimeStamp(); - Self tmp = *this; // C'est pour cela qu'on stocke la valeur - increment(); // dans un temporaire. - return tmp; - } - inline Self& operator--() // operator corresponding to ++i - { - //++_ViewEdge->getTimeStamp(); - decrement(); - return *this; - } - inline Self operator--(int) // opérateur correspondant à i++ - { // c.a.d qui renvoie la valeur *puis* incrémente. - //++_ViewEdge->getTimeStamp(); - Self tmp = *this; // C'est pour cela qu'on stocke la valeur - decrement(); // dans un temporaire. - return tmp; - } - - // comparibility - virtual bool operator!=(const Self& b) const - { - return (_ViewEdge != b._ViewEdge); - } - virtual bool operator==(const Self& b) const - { - return !(*this != b); - } - - // dereferencing - virtual reference operator*() const {return (_ViewEdge);} - virtual pointer operator->() const { return &(operator*());} - - public: - virtual bool begin() const {return _ViewEdge==_first ? true : false;} - virtual bool end() const {return _ViewEdge==0 ? true : false;} - - protected: - virtual void increment() {} - virtual void decrement() {} - }; - - template<class Traits> - class fedge_iterator_base : public IteratorBase<Traits,BidirectionalIteratorTag_Traits> - { - public: - typedef typename Traits::value_type value_type; - typedef typename Traits::difference_type difference_type; - typedef typename Traits::pointer pointer; - typedef typename Traits::reference reference; - typedef fedge_iterator_base<Traits> Self; - public: - typedef IteratorBase<Traits,BidirectionalIteratorTag_Traits> parent_class; - mutable value_type _FEdge; - value_type _first; - value_type _FEdgeB; // last fedge of the view edge - - public: - friend class ::ViewEdge; - friend class fedge_iterator; - inline fedge_iterator_base() - : parent_class() - {} - inline fedge_iterator_base(const fedge_iterator_base<Nonconst_traits<FEdge*> >& iBrother) - : parent_class() - { - _FEdge = iBrother._FEdge; - _first = iBrother._first; - _FEdgeB = iBrother._FEdgeB; - } - inline fedge_iterator_base(const fedge_iterator_base<Const_traits<FEdge*> >& iBrother) - : parent_class() - { - _FEdge = iBrother._FEdge; - _first = iBrother._first; - _FEdgeB = iBrother._FEdgeB; - } - //protected://FIXME - public: - inline fedge_iterator_base(value_type iEdge, value_type iFEdgeB) - : parent_class() - { - _FEdge = iEdge; - _first = iEdge; - _FEdgeB = iFEdgeB; - } - - public: - virtual ~fedge_iterator_base() {} - // operators - inline Self& operator++() // operator corresponding to ++i - { - increment(); - return *this; - } - inline Self operator++(int) // opérateur correspondant à i++ - { // c.a.d qui renvoie la valeur *puis* incrémente. - Self tmp = *this; // C'est pour cela qu'on stocke la valeur - increment(); // dans un temporaire. - return tmp; - } - inline Self& operator--() // operator corresponding to ++i - { - decrement(); - return *this; - } - inline Self operator--(int) // opérateur correspondant à i++ - { // c.a.d qui renvoie la valeur *puis* incrémente. - Self tmp = *this; // C'est pour cela qu'on stocke la valeur - decrement(); // dans un temporaire. - return tmp; - } - - // comparibility - virtual bool operator!=(const Self& b) const - { - return (_FEdge != b._FEdge); - } - virtual bool operator==(const Self& b) const - { - return !(*this != b); - } - - // dereferencing - virtual reference operator*() const {return (_FEdge);} - virtual pointer operator->() const { return &(operator*());} - - - public: - virtual bool begin() const {return _FEdge==_first ? true : false;} - virtual bool end() const {return _FEdge==0 ? true : false;} - protected: - virtual void increment() - { - _FEdge = _FEdge->nextEdge(); // we don't change or - } - - virtual void decrement() - { - if(0 == _FEdge) - { - _FEdge = _FEdgeB; - return; - } - _FEdge = _FEdge->previousEdge(); // we don't change or - } - }; - - template<class Traits> - class vertex_iterator_base : public IteratorBase<Traits,BidirectionalIteratorTag_Traits> - { - public: - typedef typename Traits::value_type value_type; - typedef typename Traits::difference_type difference_type; - typedef typename Traits::pointer pointer; - typedef typename Traits::reference reference; - typedef vertex_iterator_base<Traits> Self; - protected: - typedef IteratorBase<Traits,BidirectionalIteratorTag_Traits> parent_class; - public: - mutable value_type _SVertex; - FEdge *_NextFEdge; - FEdge *_PreviousFEdge; - public: - friend class ViewEdge; - friend class vertex_iterator; - inline vertex_iterator_base() - : parent_class() - {} - inline vertex_iterator_base(const vertex_iterator_base<Const_traits<SVertex*> >& iBrother) - : parent_class() - { - _SVertex = iBrother._SVertex; - _NextFEdge = iBrother._NextFEdge; - _PreviousFEdge = iBrother._PreviousFEdge; - } - inline vertex_iterator_base(const vertex_iterator_base<Nonconst_traits<SVertex*> >& iBrother) - : parent_class() - { - _SVertex = iBrother._SVertex; - _NextFEdge = iBrother._NextFEdge; - _PreviousFEdge = iBrother._PreviousFEdge; - } - - //protected://FIXME - public: - - inline vertex_iterator_base(value_type iVertex, FEdge *iPreviousFEdge, FEdge *iNextFEdge) - : parent_class() - { - _SVertex = iVertex; - _NextFEdge = iNextFEdge; - _PreviousFEdge = iPreviousFEdge; - } - - public: - virtual ~vertex_iterator_base() {} - - virtual bool begin() const {return _PreviousFEdge==0? true : false;} - virtual bool end() const {return _SVertex==0 ? true : false;} - - // operators - inline Self& operator++() // operator corresponding to ++i - { - increment(); - return *this; - } - inline Self operator++(int) // opérateur correspondant à i++ - { // c.a.d qui renvoie la valeur *puis* incrémente. - Self tmp = *this; // C'est pour cela qu'on stocke la valeur - increment(); // dans un temporaire. - return tmp; - } - inline Self& operator--() // operator corresponding to ++i - { - decrement(); - return *this; - } - inline Self operator--(int) // opérateur correspondant à i++ - { // c.a.d qui renvoie la valeur *puis* incrémente. - Self tmp = *this; // C'est pour cela qu'on stocke la valeur - decrement(); // dans un temporaire. - return tmp; - } - - // comparibility - virtual bool operator!=(const Self& b) const - { - return (_SVertex != b._SVertex); - } - virtual bool operator==(const Self& b) const - { - return !(*this != b); - } - - // dereferencing - virtual reference operator*() const {return (_SVertex);} - virtual pointer operator->() const { return &(operator*());} - - protected: - virtual void increment() - { - if(0 == _NextFEdge) - { - _SVertex = 0; - return; - } - - _SVertex = _NextFEdge->vertexB(); - _PreviousFEdge = _NextFEdge; - _NextFEdge = _NextFEdge->nextEdge(); - - } - virtual void decrement() - { - // if(0 == _SVertex) - // { - // _SVertex = _PreviousFEdge->vertexB(); - // return; - // } - if(0 == _PreviousFEdge) - { - _SVertex = 0; - return; - } - _SVertex = _PreviousFEdge->vertexA(); - _NextFEdge = _PreviousFEdge; - _PreviousFEdge = _PreviousFEdge->previousEdge(); - } - }; - - +/*!----------------------*/ +/*! Iterators definition */ +/*!----------------------*/ +template<class Traits> +class edge_iterator_base : public IteratorBase<Traits,BidirectionalIteratorTag_Traits> +{ +public: + typedef typename Traits::value_type value_type; + typedef typename Traits::difference_type difference_type; + typedef typename Traits::pointer pointer; + typedef typename Traits::reference reference; + typedef edge_iterator_base<Traits> Self; + +public: + mutable value_type _ViewEdge; + //friend class edge_iterator_base<Nonconst_traits<ViewEdge*> >; + //friend class edge_iterator_base<Const_traits<ViewEdge*> >; + value_type _first; + bool _orientation; + typedef IteratorBase<Traits,BidirectionalIteratorTag_Traits> parent_class; + +public: + friend class ViewEdge; + inline edge_iterator_base() : parent_class() + { + _orientation = true; + _first = 0; + } + + inline edge_iterator_base(const edge_iterator_base<Nonconst_traits< ::ViewEdge*> >& iBrother) : parent_class() + { + _ViewEdge = iBrother._ViewEdge; + _first = iBrother._first; + _orientation = iBrother._orientation; + } + + inline edge_iterator_base(const edge_iterator_base<Const_traits< ::ViewEdge*> >& iBrother) : parent_class() + { + _ViewEdge = iBrother._ViewEdge; + _first = iBrother._first; + _orientation = iBrother._orientation; + } + +//protected://FIXME +public: + inline edge_iterator_base(value_type iEdge, bool orientation = true) : parent_class() + { + _ViewEdge = iEdge; + _first = iEdge; + _orientation = orientation; + } + +public: + virtual Self *clone() const + { + return new edge_iterator_base(*this); + } + + virtual ~edge_iterator_base() {} + +public: + virtual bool orientation() + { + return _orientation; + } + + virtual void set_edge(value_type iVE) + { + _ViewEdge = iVE; + } + + virtual void set_orientation(bool iOrientation) + { + _orientation = iOrientation; + } + + virtual void change_orientation() + { + _orientation = !_orientation; + } + + // operators + // operator corresponding to ++i + inline Self& operator++() + { + //++_ViewEdge->getTimeStamp(); + increment(); + return *this; + } + + // operator corresponding to i++, i.e. which returns the value *and then* increments it. + // That's why we store the value in a temp. + inline Self operator++(int) + { + //++_ViewEdge->getTimeStamp(); + Self tmp = *this; + increment(); + return tmp; + } + + // operator corresponding to --i + inline Self& operator--() + { + //++_ViewEdge->getTimeStamp(); + decrement(); + return *this; + } + + // operator corresponding to i--, i.e. which returns the value *and then* increments it. + // That's why we store the value in a temp. + inline Self operator--(int) + { + //++_ViewEdge->getTimeStamp(); + Self tmp = *this; + decrement(); + return tmp; + } + + // comparibility + virtual bool operator!=(const Self& b) const + { + return (_ViewEdge != b._ViewEdge); + } + + virtual bool operator==(const Self& b) const + { + return !(*this != b); + } + + // dereferencing + virtual reference operator*() const + { + return (_ViewEdge); + } + + virtual pointer operator->() const + { + return &(operator*()); + } + +public: + virtual bool begin() const + { + return (_ViewEdge == _first) ? true : false; + } + + virtual bool end() const + { + return (_ViewEdge == 0) ? true : false; + } + +protected: + virtual void increment() {} + virtual void decrement() {} +}; + +template<class Traits> +class fedge_iterator_base : public IteratorBase<Traits,BidirectionalIteratorTag_Traits> +{ +public: + typedef typename Traits::value_type value_type; + typedef typename Traits::difference_type difference_type; + typedef typename Traits::pointer pointer; + typedef typename Traits::reference reference; + typedef fedge_iterator_base<Traits> Self; + +public: + typedef IteratorBase<Traits,BidirectionalIteratorTag_Traits> parent_class; + mutable value_type _FEdge; + value_type _first; + value_type _FEdgeB; // last fedge of the view edge + +public: + friend class ::ViewEdge; + friend class fedge_iterator; + + inline fedge_iterator_base() : parent_class() {} + + inline fedge_iterator_base(const fedge_iterator_base<Nonconst_traits<FEdge*> >& iBrother) : parent_class() + { + _FEdge = iBrother._FEdge; + _first = iBrother._first; + _FEdgeB = iBrother._FEdgeB; + } + + inline fedge_iterator_base(const fedge_iterator_base<Const_traits<FEdge*> >& iBrother) : parent_class() + { + _FEdge = iBrother._FEdge; + _first = iBrother._first; + _FEdgeB = iBrother._FEdgeB; + } + +//protected://FIXME +public: + inline fedge_iterator_base(value_type iEdge, value_type iFEdgeB) : parent_class() + { + _FEdge = iEdge; + _first = iEdge; + _FEdgeB = iFEdgeB; + } + +public: + virtual ~fedge_iterator_base() {} + + // operators + // operator corresponding to ++i. + inline Self& operator++() + { + increment(); + return *this; + } + + // operator corresponding to i++, i.e. which returns the value *and then* increments it. + // That's why we store the value in a temp. + inline Self operator++(int) + { + Self tmp = *this; + increment(); + return tmp; + } + + // operator corresponding to --i + inline Self& operator--() + { + decrement(); + return *this; + } + + // operator corresponding to i--, i.e. which returns the value *and then* increments it. + // That's why we store the value in a temp. + inline Self operator--(int) + { + Self tmp = *this; + decrement(); + return tmp; + } + + // comparibility + virtual bool operator!=(const Self& b) const + { + return (_FEdge != b._FEdge); + } + + virtual bool operator==(const Self& b) const + { + return !(*this != b); + } + + // dereferencing + virtual reference operator*() const + { + return (_FEdge); + } + + virtual pointer operator->() const + { + return &(operator*()); + } + +public: + virtual bool begin() const + { + return (_FEdge == _first) ? true : false; + } + + virtual bool end() const + { + return (_FEdge == 0) ? true : false; + } + +protected: + virtual void increment() + { + _FEdge = _FEdge->nextEdge(); // we don't change or + } + + virtual void decrement() + { + if (0 == _FEdge) { + _FEdge = _FEdgeB; + return; + } + _FEdge = _FEdge->previousEdge(); // we don't change or + } +}; + +template<class Traits> +class vertex_iterator_base : public IteratorBase<Traits,BidirectionalIteratorTag_Traits> +{ +public: + typedef typename Traits::value_type value_type; + typedef typename Traits::difference_type difference_type; + typedef typename Traits::pointer pointer; + typedef typename Traits::reference reference; + typedef vertex_iterator_base<Traits> Self; + +protected: + typedef IteratorBase<Traits,BidirectionalIteratorTag_Traits> parent_class; + +public: + mutable value_type _SVertex; + FEdge *_NextFEdge; + FEdge *_PreviousFEdge; + +public: + friend class ViewEdge; + friend class vertex_iterator; + + inline vertex_iterator_base() : parent_class() {} + + inline vertex_iterator_base(const vertex_iterator_base<Const_traits<SVertex*> >& iBrother) : parent_class() + { + _SVertex = iBrother._SVertex; + _NextFEdge = iBrother._NextFEdge; + _PreviousFEdge = iBrother._PreviousFEdge; + } + + inline vertex_iterator_base(const vertex_iterator_base<Nonconst_traits<SVertex*> >& iBrother) : parent_class() + { + _SVertex = iBrother._SVertex; + _NextFEdge = iBrother._NextFEdge; + _PreviousFEdge = iBrother._PreviousFEdge; + } + +//protected://FIXME +public: + inline vertex_iterator_base(value_type iVertex, FEdge *iPreviousFEdge, FEdge *iNextFEdge) : parent_class() + { + _SVertex = iVertex; + _NextFEdge = iNextFEdge; + _PreviousFEdge = iPreviousFEdge; + } + +public: + virtual ~vertex_iterator_base() {} + + virtual bool begin() const + { + return (_PreviousFEdge == 0) ? true : false; + } + + virtual bool end() const + { + return (_SVertex == 0) ? true : false; + } + + // operators + // operator corresponding to ++i + inline Self& operator++() + { + increment(); + return *this; + } + + // operator corresponding to i++, i.e. which returns the value *and then* increments it. + // That's why we store the value in a temp. + inline Self operator++(int) + { + Self tmp = *this; + increment(); + return tmp; + } + + // operator corresponding to --i + inline Self& operator--() + { + decrement(); + return *this; + } + + // operator corresponding to --i, i.e. which returns the value *and then* increments it. + // That's why we store the value in a temp. + inline Self operator--(int) + { + Self tmp = *this; + decrement(); + return tmp; + } + + // comparibility + virtual bool operator!=(const Self& b) const + { + return (_SVertex != b._SVertex); + } + + virtual bool operator==(const Self& b) const + { + return !(*this != b); + } + + // dereferencing + virtual reference operator*() const + { + return (_SVertex); + } + + virtual pointer operator->() const + { + return &(operator*()); + } + +protected: + virtual void increment() + { + if (!_NextFEdge) { + _SVertex = NULL; + return; + } + _SVertex = _NextFEdge->vertexB(); + _PreviousFEdge = _NextFEdge; + _NextFEdge = _NextFEdge->nextEdge(); + } + + virtual void decrement() + { +#if 0 + if (!_SVertex) { + _SVertex = _PreviousFEdge->vertexB(); + return; + } +#endif + if (!_PreviousFEdge) { + _SVertex = NULL; + return; + } + _SVertex = _PreviousFEdge->vertexA(); + _NextFEdge = _PreviousFEdge; + _PreviousFEdge = _PreviousFEdge->previousEdge(); + } +}; + } // end of namespace ViewEdgeInternal -#endif // VIEWMAPADVANCEDITERATORS_H +#endif // __FREESTYLE_VIEW_MAP_ADVANCED_ITERATORS_H__ |