33 #ifndef SHARK_CORE_ITERATORS_H 34 #define SHARK_CORE_ITERATORS_H 36 #include <boost/version.hpp> 37 #include "Impl/boost_iterator_facade_fixed.hpp" 40 #include <boost/range/iterator.hpp> 46 template<
class Iterator>
48 IndexedIterator<Iterator>,
49 typename boost::iterator_value<Iterator>::type,
50 std::random_access_iterator_tag,
51 typename boost::iterator_reference<Iterator>::type
61 : m_iterator(iterator.m_iterator),m_index(iterator.
index){}
64 template<
class IteratorT>
66 : m_iterator(Iterator(iterator)),m_index(startIndex){}
72 typedef SHARK_ITERATOR_FACADE<
74 typename boost::iterator_value<Iterator>::type,
75 boost::random_access_traversal_tag,
76 typename boost::iterator_reference<Iterator>::type
81 typename base_type::reference dereference()
const {
94 void advance(std::ptrdiff_t n){
101 return other.m_iterator - m_iterator;
106 return m_iterator == other.m_iterator;
117 template<
class Sequence,
class ValueType,
class Reference>
119 ProxyIterator<Sequence,ValueType,Reference>,
122 std::random_access_iterator_tag,
129 : m_sequence(&seq),m_position(position) {}
131 template<
class S,
class V,
class R>
133 : m_sequence(other.m_sequence),m_position(other.m_position) {}
146 void advance(std::ptrdiff_t n){
151 std::ptrdiff_t distance_to(
const Iter& other)
const{
152 return (std::ptrdiff_t)other.m_position - (std::ptrdiff_t)m_position;
156 bool equal(Iter
const& other)
const{
157 return (m_position == other.m_position);
159 Reference dereference()
const {
160 return Reference(*m_sequence,m_position);
164 std::size_t m_position;
171 template<
class Self,
class SequenceContainer>
172 struct SequenceOfSequenceIteratorTraits{
173 typedef typename boost::remove_const<SequenceContainer>::type OuterSequence;
174 typedef typename boost::range_iterator<SequenceContainer>::type outer_iterator;
178 typedef typename boost::remove_reference<
179 typename boost::iterator_reference<outer_iterator>::type
180 >::type InnerSequence;
181 typedef typename boost::range_iterator<InnerSequence>::type inner_iterator;
182 typedef typename boost::iterator_reference<inner_iterator>::type reference;
183 typedef typename boost::iterator_value<inner_iterator>::type value_type;
186 typedef SHARK_ITERATOR_FACADE< Self, value_type, std::random_access_iterator_tag, reference > base;
197 template<
class SequenceContainer>
199 MultiSequenceIterator<SequenceContainer>,
203 typedef detail::SequenceOfSequenceIteratorTraits<
206 typedef typename Traits::outer_iterator outer_iterator;
210 :m_positionInSequence(0){}
212 template<
class OuterIter,
class InnerIter>
214 OuterIter outerBegin,
216 OuterIter outerPosition,
217 InnerIter innerPosition,
218 std::size_t positionInSequence
219 ):m_outerBegin(outer_iterator(outerBegin)),
220 m_outerPosition(outer_iterator(outerPosition)),
221 m_outerEnd(outer_iterator(outerEnd)),
222 m_innerPosition(innerPosition),
223 m_positionInSequence(positionInSequence){
225 if(m_outerPosition != m_outerEnd){
226 m_innerBegin = boost::begin(*m_outerPosition);
227 m_innerEnd = boost::end(*m_outerPosition);
235 : m_outerBegin(other.m_outerBegin),m_outerPosition(other.m_outerPosition),m_outerEnd(other.m_outerEnd),
236 m_innerBegin(other.m_innerBegin),m_innerPosition(other.m_innerPosition),m_innerEnd(other.m_innerEnd),
237 m_positionInSequence(other.m_positionInSequence) {}
240 return m_positionInSequence;
244 return m_innerPosition;
252 ++m_positionInSequence;
254 if(m_innerPosition == m_innerEnd){
256 while (m_outerPosition != m_outerEnd){
257 m_innerBegin = boost::begin(*m_outerPosition);
258 m_innerEnd = boost::end(*m_outerPosition);
259 if(m_innerBegin != m_innerEnd){
260 m_innerPosition = m_innerBegin;
269 --m_positionInSequence;
270 if(m_innerPosition != m_innerBegin){
276 m_innerBegin = boost::begin(*m_outerPosition);
277 m_innerEnd = boost::end(*m_outerPosition);
278 while(m_innerBegin == m_innerEnd){
279 if( m_outerPosition == m_outerBegin)
282 m_innerBegin = boost::begin(*m_outerPosition);
283 m_innerEnd = boost::end(*m_outerPosition);
285 m_innerPosition = m_innerEnd-1;
289 void advance(std::ptrdiff_t n){
290 m_positionInSequence += n;
291 std::ptrdiff_t diff = m_innerPosition - m_innerBegin;
294 m_innerPosition = m_innerBegin;
300 while ((
unsigned int) n >=
shark::size(*m_outerPosition) ){
305 m_innerBegin = boost::begin(*m_outerPosition);
306 m_innerEnd = boost::end(*m_outerPosition);
307 m_innerPosition = m_innerEnd-(n+1);
312 while (m_outerPosition != m_outerEnd && (
unsigned int)n >=
shark::size(*m_outerPosition) ){
316 SHARK_CHECK(m_outerPosition != m_outerEnd || (n == 0),
"iterator went past the end");
318 if(m_outerPosition != m_outerEnd){
319 m_innerBegin = boost::begin(*m_outerPosition);
320 m_innerPosition = m_innerBegin+n;
321 m_innerEnd = boost::end(*m_outerPosition);
327 std::ptrdiff_t distance_to(
const Iter& other)
const{
328 return (std::ptrdiff_t)other.m_positionInSequence - (std::ptrdiff_t)m_positionInSequence;
332 bool equal(Iter
const& other)
const{
333 return (m_positionInSequence == other.m_positionInSequence);
335 typename Traits::reference dereference()
const {
336 return *m_innerPosition;
339 outer_iterator m_outerBegin;
340 outer_iterator m_outerPosition;
341 outer_iterator m_outerEnd;
343 inner_iterator m_innerBegin;
344 inner_iterator m_innerPosition;
345 inner_iterator m_innerEnd;
347 std::size_t m_positionInSequence;