annotate DEPENDENCIES/generic/include/boost/geometry/iterators/concatenate_iterator.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents f46d142149f5
children
rev   line source
Chris@102 1 // Boost.Geometry (aka GGL, Generic Geometry Library)
Chris@102 2
Chris@102 3 // Copyright (c) 2014, Oracle and/or its affiliates.
Chris@102 4
Chris@102 5 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
Chris@102 6
Chris@102 7 // Licensed under the Boost Software License version 1.0.
Chris@102 8 // http://www.boost.org/users/license.html
Chris@102 9
Chris@102 10 #ifndef BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP
Chris@102 11 #define BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP
Chris@102 12
Chris@102 13 #include <boost/assert.hpp>
Chris@102 14 #include <boost/mpl/assert.hpp>
Chris@102 15 #include <boost/type_traits/is_convertible.hpp>
Chris@102 16 #include <boost/iterator.hpp>
Chris@102 17 #include <boost/iterator/iterator_facade.hpp>
Chris@102 18 #include <boost/iterator/iterator_categories.hpp>
Chris@102 19
Chris@102 20
Chris@102 21 namespace boost { namespace geometry
Chris@102 22 {
Chris@102 23
Chris@102 24
Chris@102 25
Chris@102 26 template
Chris@102 27 <
Chris@102 28 typename Iterator1,
Chris@102 29 typename Iterator2,
Chris@102 30 typename Value,
Chris@102 31 typename Reference = Value&
Chris@102 32 >
Chris@102 33 class concatenate_iterator
Chris@102 34 : public boost::iterator_facade
Chris@102 35 <
Chris@102 36 concatenate_iterator<Iterator1, Iterator2, Value, Reference>,
Chris@102 37 Value,
Chris@102 38 boost::bidirectional_traversal_tag,
Chris@102 39 Reference
Chris@102 40 >
Chris@102 41 {
Chris@102 42 private:
Chris@102 43 Iterator1 m_it1, m_end1;
Chris@102 44 Iterator2 m_begin2, m_it2;
Chris@102 45
Chris@102 46 public:
Chris@102 47 typedef Iterator1 first_iterator_type;
Chris@102 48 typedef Iterator2 second_iterator_type;
Chris@102 49
Chris@102 50 // default constructor
Chris@102 51 concatenate_iterator() {}
Chris@102 52
Chris@102 53 // for begin
Chris@102 54 concatenate_iterator(Iterator1 it1, Iterator1 end1,
Chris@102 55 Iterator2 begin2, Iterator2 it2)
Chris@102 56 : m_it1(it1), m_end1(end1), m_begin2(begin2), m_it2(it2)
Chris@102 57 {}
Chris@102 58
Chris@102 59 // for end
Chris@102 60 concatenate_iterator(Iterator1 end1, Iterator2 begin2, Iterator2 end2)
Chris@102 61 : m_it1(end1), m_end1(end1), m_begin2(begin2), m_it2(end2)
Chris@102 62 {}
Chris@102 63
Chris@102 64 template
Chris@102 65 <
Chris@102 66 typename OtherIt1,
Chris@102 67 typename OtherIt2,
Chris@102 68 typename OtherValue,
Chris@102 69 typename OtherReference
Chris@102 70 >
Chris@102 71 concatenate_iterator(concatenate_iterator
Chris@102 72 <
Chris@102 73 OtherIt1,
Chris@102 74 OtherIt2,
Chris@102 75 OtherValue,
Chris@102 76 OtherReference
Chris@102 77 > const& other)
Chris@102 78 : m_it1(other.m_it1)
Chris@102 79 , m_end1(other.m_end1)
Chris@102 80 , m_begin2(other.m_begin2)
Chris@102 81 , m_it2(other.m_it2)
Chris@102 82 {
Chris@102 83 static const bool are_conv
Chris@102 84 = boost::is_convertible<OtherIt1, Iterator1>::value
Chris@102 85 && boost::is_convertible<OtherIt2, Iterator2>::value;
Chris@102 86
Chris@102 87 BOOST_MPL_ASSERT_MSG((are_conv),
Chris@102 88 NOT_CONVERTIBLE,
Chris@102 89 (types<OtherIt1, OtherIt2>));
Chris@102 90 }
Chris@102 91
Chris@102 92 private:
Chris@102 93 friend class boost::iterator_core_access;
Chris@102 94
Chris@102 95 template <typename It1, typename It2, typename V, typename R>
Chris@102 96 friend class concatenate_iterator;
Chris@102 97
Chris@102 98 inline Reference dereference() const
Chris@102 99 {
Chris@102 100 if ( m_it1 == m_end1 )
Chris@102 101 {
Chris@102 102 return *m_it2;
Chris@102 103 }
Chris@102 104 return *m_it1;
Chris@102 105 }
Chris@102 106
Chris@102 107 template
Chris@102 108 <
Chris@102 109 typename OtherIt1,
Chris@102 110 typename OtherIt2,
Chris@102 111 typename OtherValue,
Chris@102 112 typename OtherReference
Chris@102 113 >
Chris@102 114 inline bool equal(concatenate_iterator
Chris@102 115 <
Chris@102 116 OtherIt1,
Chris@102 117 OtherIt2,
Chris@102 118 OtherValue,
Chris@102 119 OtherReference
Chris@102 120 > const& other) const
Chris@102 121 {
Chris@102 122 return m_it1 == other.m_it1 && m_it2 == other.m_it2;
Chris@102 123 }
Chris@102 124
Chris@102 125 inline void increment()
Chris@102 126 {
Chris@102 127 if ( m_it1 == m_end1 )
Chris@102 128 {
Chris@102 129 ++m_it2;
Chris@102 130 }
Chris@102 131 else
Chris@102 132 {
Chris@102 133 ++m_it1;
Chris@102 134 }
Chris@102 135 }
Chris@102 136
Chris@102 137 inline void decrement()
Chris@102 138 {
Chris@102 139 if ( m_it2 == m_begin2 )
Chris@102 140 {
Chris@102 141 --m_it1;
Chris@102 142 }
Chris@102 143 else
Chris@102 144 {
Chris@102 145 --m_it2;
Chris@102 146 }
Chris@102 147 }
Chris@102 148 };
Chris@102 149
Chris@102 150
Chris@102 151
Chris@102 152 }} // namespace boost::geometry
Chris@102 153
Chris@102 154 #endif // BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP