1#ifndef BL_ITERATORFUNCTORS_HPP
2#define BL_ITERATORFUNCTORS_HPP
50 template<
typename blContainerType>
51 static auto begin(blContainerType& container)->decltype(container.begin()){
return container.begin();}
53 template<
typename blContainerType>
54 static auto end(blContainerType& container)->decltype(container.end()){
return container.end();}
60 template<
typename blContainerType>
61 static auto begin(
const blContainerType& container)->decltype(container.cbegin()){
return container.cbegin();}
63 template<
typename blContainerType>
64 static auto end(
const blContainerType& container)->decltype(container.cend()){
return container.cend();}
70 template<
typename blContainerType>
71 static auto begin(blContainerType& container)->decltype(container.rbegin()){
return container.rbegin();}
73 template<
typename blContainerType>
74 static auto end(blContainerType& container)->decltype(container.rend()){
return container.rend();}
80 template<
typename blContainerType>
81 static auto begin(
const blContainerType& container)->decltype(container.crbegin()){
return container.crbegin();}
83 template<
typename blContainerType>
84 static auto end(
const blContainerType& container)->decltype(container.crend()){
return container.crend();}
101 template<
typename blIteratorType>
103 const ptrdiff_t& howManyStepsToAdvanceIter,
104 const blIteratorType& beginIter,
105 const blIteratorType& endIter,
106 const ptrdiff_t& distanceFromBeginToIter,
107 const ptrdiff_t& distanceFromIterToEnd)
109 if(howManyStepsToAdvanceIter > 0)
111 if(howManyStepsToAdvanceIter > distanceFromIterToEnd)
114 std::advance(iter,howManyStepsToAdvanceIter);
116 else if(howManyStepsToAdvanceIter < 0)
118 if((-howManyStepsToAdvanceIter) > distanceFromBeginToIter)
121 std::advance(iter,howManyStepsToAdvanceIter);
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)
131 return ( distanceFromBeginToIter2 - distanceFromBeginToIter1 );
150 template<
typename blIteratorType>
152 const ptrdiff_t& howManyStepsToAdvanceIter,
153 const blIteratorType& beginIter,
154 const blIteratorType& endIter,
155 const ptrdiff_t& distanceFromBeginToIter,
156 const ptrdiff_t& distanceFromIterToEnd)
158 if(howManyStepsToAdvanceIter > 0)
160 if(howManyStepsToAdvanceIter < distanceFromIterToEnd)
161 std::advance(iter,howManyStepsToAdvanceIter);
168 (howManyStepsToAdvanceIter - distanceFromIterToEnd) %
169 (distanceFromBeginToIter + distanceFromIterToEnd)
173 else if(howManyStepsToAdvanceIter < 0)
175 if((-howManyStepsToAdvanceIter) < distanceFromBeginToIter)
176 std::advance(iter,howManyStepsToAdvanceIter);
183 (distanceFromBeginToIter + distanceFromIterToEnd) +
184 (howManyStepsToAdvanceIter - distanceFromIterToEnd) %
185 (distanceFromBeginToIter + distanceFromIterToEnd)
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)
197 if(distanceFromBeginToIter1 <= distanceFromBeginToIter2)
198 return ( distanceFromBeginToIter2 - distanceFromBeginToIter1 );
201 return ( distanceFromIterToEnd1 + distanceFromBeginToIter2);
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())