PGE API 0.4
PR00F's Game Engine full documentation
Loading...
Searching...
No Matches
blIteratorFunctors.hpp
Go to the documentation of this file.
1#ifndef BL_ITERATORFUNCTORS_HPP
2#define BL_ITERATORFUNCTORS_HPP
3
4
5//-------------------------------------------------------------------
6// FILE: blIteratorFunctors.hpp
7// CLASS: None
8// BASE CLASS: None
9//
10// PURPOSE: Functors defined in this file are used
11// by iterators in the blIteratorAPI library
12// to "advance" and to get "begin" and "end"
13// iterators.
14//
15// - The iterator itself
16// - The container's "begin" and "end" iterators
17//
18// AUTHOR: Vincenzo Barbato
19// http://www.barbatolabs.com
20// navyenzo@gmail.com
21//
22// LISENSE: MIT-LICENCE
23// http://www.opensource.org/licenses/mit-license.php
24//
25// DEPENDENCIES: - std::distance -- Used to calculate the
26// distance from the beginning
27// to the iterator and from the
28// iterator to the end if needed
29//
30// - std::advance -- Used to actually advance
31// the specified iterator
32// once the algorithm has
33// decided how much to advance
34// it by.
35//
36// NOTES:
37//
38// DATE CREATED: Jan/08/2014
39//
40// DATE UPDATED:
41//-------------------------------------------------------------------
42
43
44//-------------------------------------------------------------------
45// Define "begin" and "end" functors
46// to use with smart iterators
47//-------------------------------------------------------------------
49{
50 template<typename blContainerType>
51 static auto begin(blContainerType& container)->decltype(container.begin()){return container.begin();}
52
53 template<typename blContainerType>
54 static auto end(blContainerType& container)->decltype(container.end()){return container.end();}
55};
56
57
59{
60 template<typename blContainerType>
61 static auto begin(const blContainerType& container)->decltype(container.cbegin()){return container.cbegin();}
62
63 template<typename blContainerType>
64 static auto end(const blContainerType& container)->decltype(container.cend()){return container.cend();}
65};
66
67
69{
70 template<typename blContainerType>
71 static auto begin(blContainerType& container)->decltype(container.rbegin()){return container.rbegin();}
72
73 template<typename blContainerType>
74 static auto end(blContainerType& container)->decltype(container.rend()){return container.rend();}
75};
76
77
79{
80 template<typename blContainerType>
81 static auto begin(const blContainerType& container)->decltype(container.crbegin()){return container.crbegin();}
82
83 template<typename blContainerType>
84 static auto end(const blContainerType& container)->decltype(container.crend()){return container.crend();}
85};
86//-------------------------------------------------------------------
87
88
89//-------------------------------------------------------------------
90// Functor: - blAdvanceLinearly
91//
92// PURPOSE: - This functor advances an iterator
93// forward or in reverse but stopping
94// if it reaches the specified "end" or
95// "begin" iterators.
96//
97// DEPENDENCIES: - blAdvance
98//-------------------------------------------------------------------
100{
101 template<typename blIteratorType>
102 static void advance(blIteratorType& iter,
103 const ptrdiff_t& howManyStepsToAdvanceIter,
104 const blIteratorType& beginIter,
105 const blIteratorType& endIter,
106 const ptrdiff_t& distanceFromBeginToIter,
107 const ptrdiff_t& distanceFromIterToEnd)
108 {
109 if(howManyStepsToAdvanceIter > 0)
110 {
111 if(howManyStepsToAdvanceIter > distanceFromIterToEnd)
112 iter = endIter;
113 else
114 std::advance(iter,howManyStepsToAdvanceIter);
115 }
116 else if(howManyStepsToAdvanceIter < 0)
117 {
118 if((-howManyStepsToAdvanceIter) > distanceFromBeginToIter)
119 iter = beginIter;
120 else
121 std::advance(iter,howManyStepsToAdvanceIter);
122 }
123 }
124
125 template<typename blIteratorType>
126 static ptrdiff_t distance(const ptrdiff_t& distanceFromBeginToIter1,
127 const ptrdiff_t& distanceFromBeginToIter2,
128 const ptrdiff_t& distanceFromIterToEnd1,
129 const ptrdiff_t& distanceFromIterToEnd2)
130 {
131 return ( distanceFromBeginToIter2 - distanceFromBeginToIter1 );
132 }
133};
134//-------------------------------------------------------------------
135
136
137//-------------------------------------------------------------------
138// Functor: - blAdvanceCircularly
139//
140// PURPOSE: - This functor advances an iterator
141// forward or in reverse in a circular
142// way, simulating a "ring buffer".
143// - If the iterator is equal to the
144// "end" iterator, then it is not advanced.
145//
146// DEPENDENCIES: - blAdvance
147//-------------------------------------------------------------------
149{
150 template<typename blIteratorType>
151 static void advance(blIteratorType& iter,
152 const ptrdiff_t& howManyStepsToAdvanceIter,
153 const blIteratorType& beginIter,
154 const blIteratorType& endIter,
155 const ptrdiff_t& distanceFromBeginToIter,
156 const ptrdiff_t& distanceFromIterToEnd)
157 {
158 if(howManyStepsToAdvanceIter > 0)
159 {
160 if(howManyStepsToAdvanceIter < distanceFromIterToEnd)
161 std::advance(iter,howManyStepsToAdvanceIter);
162 else
163 {
164 iter = beginIter;
165
166 std::advance(
167 iter,
168 (howManyStepsToAdvanceIter - distanceFromIterToEnd) %
169 (distanceFromBeginToIter + distanceFromIterToEnd)
170 );
171 }
172 }
173 else if(howManyStepsToAdvanceIter < 0)
174 {
175 if((-howManyStepsToAdvanceIter) < distanceFromBeginToIter)
176 std::advance(iter,howManyStepsToAdvanceIter);
177 else
178 {
179 iter = beginIter;
180
181 std::advance(
182 iter,
183 (distanceFromBeginToIter + distanceFromIterToEnd) +
184 (howManyStepsToAdvanceIter - distanceFromIterToEnd) %
185 (distanceFromBeginToIter + distanceFromIterToEnd)
186 );
187 }
188 }
189 }
190
191 template<typename blIteratorType>
192 static ptrdiff_t distance(const ptrdiff_t& distanceFromBeginToIter1,
193 const ptrdiff_t& distanceFromBeginToIter2,
194 const ptrdiff_t& distanceFromIterToEnd1,
195 const ptrdiff_t& distanceFromIterToEnd2)
196 {
197 if(distanceFromBeginToIter1 <= distanceFromBeginToIter2)
198 return ( distanceFromBeginToIter2 - distanceFromBeginToIter1 );
199 else
200 {
201 return ( distanceFromIterToEnd1 + distanceFromBeginToIter2);
202 }
203 }
204};
205//-------------------------------------------------------------------
206
207
208#endif // BL_ITERATORFUNCTORS_HPP
static ptrdiff_t distance(const ptrdiff_t &distanceFromBeginToIter1, const ptrdiff_t &distanceFromBeginToIter2, const ptrdiff_t &distanceFromIterToEnd1, const ptrdiff_t &distanceFromIterToEnd2)
static void advance(blIteratorType &iter, const ptrdiff_t &howManyStepsToAdvanceIter, const blIteratorType &beginIter, const blIteratorType &endIter, const ptrdiff_t &distanceFromBeginToIter, const ptrdiff_t &distanceFromIterToEnd)
static ptrdiff_t distance(const ptrdiff_t &distanceFromBeginToIter1, const ptrdiff_t &distanceFromBeginToIter2, const ptrdiff_t &distanceFromIterToEnd1, const ptrdiff_t &distanceFromIterToEnd2)
static void advance(blIteratorType &iter, const ptrdiff_t &howManyStepsToAdvanceIter, const blIteratorType &beginIter, const blIteratorType &endIter, const ptrdiff_t &distanceFromBeginToIter, const ptrdiff_t &distanceFromIterToEnd)
static auto begin(blContainerType &container) -> decltype(container.begin())
static auto end(blContainerType &container) -> decltype(container.end())
static auto end(const blContainerType &container) -> decltype(container.cend())
static auto begin(const blContainerType &container) -> decltype(container.cbegin())
static auto end(const blContainerType &container) -> decltype(container.crend())
static auto begin(const blContainerType &container) -> decltype(container.crbegin())
static auto end(blContainerType &container) -> decltype(container.rend())
static auto begin(blContainerType &container) -> decltype(container.rbegin())