Chris@102: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@102: Chris@102: // Copyright (c) 2014, Oracle and/or its affiliates. Chris@102: Chris@102: // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle Chris@102: Chris@102: // Licensed under the Boost Software License version 1.0. Chris@102: // http://www.boost.org/users/license.html Chris@102: Chris@102: #ifndef BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP Chris@102: #define BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: Chris@102: namespace boost { namespace geometry Chris@102: { Chris@102: Chris@102: Chris@102: Chris@102: template Chris@102: < Chris@102: typename Iterator1, Chris@102: typename Iterator2, Chris@102: typename Value, Chris@102: typename Reference = Value& Chris@102: > Chris@102: class concatenate_iterator Chris@102: : public boost::iterator_facade Chris@102: < Chris@102: concatenate_iterator, Chris@102: Value, Chris@102: boost::bidirectional_traversal_tag, Chris@102: Reference Chris@102: > Chris@102: { Chris@102: private: Chris@102: Iterator1 m_it1, m_end1; Chris@102: Iterator2 m_begin2, m_it2; Chris@102: Chris@102: public: Chris@102: typedef Iterator1 first_iterator_type; Chris@102: typedef Iterator2 second_iterator_type; Chris@102: Chris@102: // default constructor Chris@102: concatenate_iterator() {} Chris@102: Chris@102: // for begin Chris@102: concatenate_iterator(Iterator1 it1, Iterator1 end1, Chris@102: Iterator2 begin2, Iterator2 it2) Chris@102: : m_it1(it1), m_end1(end1), m_begin2(begin2), m_it2(it2) Chris@102: {} Chris@102: Chris@102: // for end Chris@102: concatenate_iterator(Iterator1 end1, Iterator2 begin2, Iterator2 end2) Chris@102: : m_it1(end1), m_end1(end1), m_begin2(begin2), m_it2(end2) Chris@102: {} Chris@102: Chris@102: template Chris@102: < Chris@102: typename OtherIt1, Chris@102: typename OtherIt2, Chris@102: typename OtherValue, Chris@102: typename OtherReference Chris@102: > Chris@102: concatenate_iterator(concatenate_iterator Chris@102: < Chris@102: OtherIt1, Chris@102: OtherIt2, Chris@102: OtherValue, Chris@102: OtherReference Chris@102: > const& other) Chris@102: : m_it1(other.m_it1) Chris@102: , m_end1(other.m_end1) Chris@102: , m_begin2(other.m_begin2) Chris@102: , m_it2(other.m_it2) Chris@102: { Chris@102: static const bool are_conv Chris@102: = boost::is_convertible::value Chris@102: && boost::is_convertible::value; Chris@102: Chris@102: BOOST_MPL_ASSERT_MSG((are_conv), Chris@102: NOT_CONVERTIBLE, Chris@102: (types)); Chris@102: } Chris@102: Chris@102: private: Chris@102: friend class boost::iterator_core_access; Chris@102: Chris@102: template Chris@102: friend class concatenate_iterator; Chris@102: Chris@102: inline Reference dereference() const Chris@102: { Chris@102: if ( m_it1 == m_end1 ) Chris@102: { Chris@102: return *m_it2; Chris@102: } Chris@102: return *m_it1; Chris@102: } Chris@102: Chris@102: template Chris@102: < Chris@102: typename OtherIt1, Chris@102: typename OtherIt2, Chris@102: typename OtherValue, Chris@102: typename OtherReference Chris@102: > Chris@102: inline bool equal(concatenate_iterator Chris@102: < Chris@102: OtherIt1, Chris@102: OtherIt2, Chris@102: OtherValue, Chris@102: OtherReference Chris@102: > const& other) const Chris@102: { Chris@102: return m_it1 == other.m_it1 && m_it2 == other.m_it2; Chris@102: } Chris@102: Chris@102: inline void increment() Chris@102: { Chris@102: if ( m_it1 == m_end1 ) Chris@102: { Chris@102: ++m_it2; Chris@102: } Chris@102: else Chris@102: { Chris@102: ++m_it1; Chris@102: } Chris@102: } Chris@102: Chris@102: inline void decrement() Chris@102: { Chris@102: if ( m_it2 == m_begin2 ) Chris@102: { Chris@102: --m_it1; Chris@102: } Chris@102: else Chris@102: { Chris@102: --m_it2; Chris@102: } Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: Chris@102: }} // namespace boost::geometry Chris@102: Chris@102: #endif // BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP