Merged changes in the trunk up to revision 28600.
[blender.git] / source / blender / freestyle / intern / stroke / StrokeAdvancedIterators.h
1 //
2 //  Filename         : StrokeAdvancedIterators.h
3 //  Author(s)        : Stephane Grabli
4 //  Purpose          : Iterators used to iterate over the elements of the Stroke
5 //                     Can't be used in python
6 //  Date of creation : 01/07/2003
7 //
8 ///////////////////////////////////////////////////////////////////////////////
9
10
11 //
12 //  Copyright (C) : Please refer to the COPYRIGHT file distributed 
13 //   with this source distribution. 
14 //
15 //  This program is free software; you can redistribute it and/or
16 //  modify it under the terms of the GNU General Public License
17 //  as published by the Free Software Foundation; either version 2
18 //  of the License, or (at your option) any later version.
19 //
20 //  This program is distributed in the hope that it will be useful,
21 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
22 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 //  GNU General Public License for more details.
24 //
25 //  You should have received a copy of the GNU General Public License
26 //  along with this program; if not, write to the Free Software
27 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
28 //
29 ///////////////////////////////////////////////////////////////////////////////
30
31 #ifndef  STROKEADVANCEDITERATORS_H
32 # define STROKEADVANCEDITERATORS_H
33
34 # include "Stroke.h"
35
36 namespace StrokeInternal {
37
38   class vertex_const_traits : public Const_traits<StrokeVertex*> {
39   public:
40     typedef std::deque<StrokeVertex*> vertex_container; 
41     typedef vertex_container::const_iterator vertex_container_iterator ;
42   };
43   class vertex_nonconst_traits : public Nonconst_traits<StrokeVertex*> {
44   public:
45     typedef std::deque<StrokeVertex*> vertex_container; //! the vertices container
46     typedef vertex_container::iterator vertex_container_iterator ;
47   };
48
49
50   template<class Traits>
51     class vertex_iterator_base : public IteratorBase<Traits,BidirectionalIteratorTag_Traits>
52   {
53   public:
54     typedef vertex_iterator_base<Traits>  Self;
55   protected:
56     typedef IteratorBase<Traits,BidirectionalIteratorTag_Traits> parent_class;
57     typedef typename Traits::vertex_container_iterator vertex_container_iterator;
58     typedef vertex_iterator_base<vertex_nonconst_traits> iterator;
59     typedef vertex_iterator_base<vertex_const_traits> const_iterator;
60     //protected:
61   public:
62     vertex_container_iterator _it;
63     vertex_container_iterator _begin;
64     vertex_container_iterator _end;
65   public:
66     friend class Stroke;
67     //friend class vertex_iterator;
68     inline vertex_iterator_base()
69       : parent_class()
70     {}
71     inline vertex_iterator_base(const iterator& iBrother) 
72       : parent_class()
73     {_it = iBrother._it;_begin = iBrother._begin;_end = iBrother._end;} 
74     inline vertex_iterator_base(const const_iterator& iBrother) 
75       : parent_class()
76     {_it = iBrother._it;_begin = iBrother._begin;_end = iBrother._end;} 
77   //protected://FIXME
78   public:
79     inline vertex_iterator_base(vertex_container_iterator it, vertex_container_iterator begin, vertex_container_iterator end)
80       : parent_class()
81     {
82       _it = it;
83       _begin = begin;
84       _end = end;
85     }
86     
87   public:
88     virtual ~vertex_iterator_base() {}
89     
90     virtual bool begin() const {return _it==_begin? true : false;}
91     virtual bool end() const {return _it==_end ? true : false;}
92     
93     // operators
94     inline Self& operator++()  // operator corresponding to ++i
95     { 
96       ++_it;
97       return *(this);
98     }
99     inline Self operator++(int)  // opérateur correspondant à i++ 
100     {
101       Self tmp = *this;        // C'est pour cela qu'on stocke la valeur
102       ++_it;                    // dans un temporaire. 
103       return tmp;
104     }
105     inline Self& operator--()  // operator corresponding to ++i
106     { 
107       --_it;
108       return *(this);
109     }
110     inline Self operator--(int)  // opérateur correspondant à i++ 
111     {                                  // c.a.d qui renvoie la valeur *puis* incrémente.
112       Self tmp = *this;        // C'est pour cela qu'on stocke la valeur
113       --_it;                    // dans un temporaire. 
114       return tmp;
115     }
116     
117     // comparibility
118     virtual bool operator!=(const Self& b) const
119     {
120       return (_it != b._it);
121     }
122     virtual bool operator==(const Self& b) const
123     {
124       return !(*this != b);
125     }
126     
127     // dereferencing
128     virtual typename Traits::reference operator*() const  {return *(_it);}
129     virtual typename Traits::pointer operator->() const { return &(operator*());}
130     
131     /*! accessors */
132     inline vertex_container_iterator it() const {return _it;}
133     inline vertex_container_iterator getBegin() const {return _begin;}
134     inline vertex_container_iterator getEnd() const {return _end;}
135   };
136
137 } // end of namespace StrokeInternal
138
139
140 #endif // STROKEADVANCEDITERATORS_H
141
142