Warning, file /include/boost/geometry/views/closeable_view.hpp was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #ifndef BOOST_GEOMETRY_VIEWS_CLOSEABLE_VIEW_HPP
0020 #define BOOST_GEOMETRY_VIEWS_CLOSEABLE_VIEW_HPP
0021
0022 #include <boost/geometry/core/closure.hpp>
0023 #include <boost/geometry/core/point_order.hpp>
0024 #include <boost/geometry/core/ring_type.hpp>
0025 #include <boost/geometry/core/tag.hpp>
0026 #include <boost/geometry/core/tags.hpp>
0027 #include <boost/geometry/iterators/closing_iterator.hpp>
0028
0029 #include <boost/geometry/views/identity_view.hpp>
0030
0031 namespace boost { namespace geometry
0032 {
0033
0034
0035 #ifndef DOXYGEN_NO_DETAIL
0036 namespace detail
0037 {
0038
0039 template <typename Range>
0040 struct closing_view
0041 {
0042 using iterator = closing_iterator<Range const>;
0043 using const_iterator = closing_iterator<Range const>;
0044
0045
0046 explicit inline closing_view(Range const& r)
0047 : m_begin(r)
0048 , m_end(r, true)
0049 {}
0050
0051 inline const_iterator begin() const { return m_begin; }
0052 inline const_iterator end() const { return m_end; }
0053
0054 private:
0055 const_iterator m_begin;
0056 const_iterator m_end;
0057 };
0058
0059
0060 template
0061 <
0062 typename Range,
0063 closure_selector Close = geometry::closure<Range>::value
0064 >
0065 struct closed_view
0066 : identity_view<Range>
0067 {
0068 explicit inline closed_view(Range const& r)
0069 : identity_view<Range const>(r)
0070 {}
0071 };
0072
0073 template <typename Range>
0074 struct closed_view<Range, open>
0075 : closing_view<Range>
0076 {
0077 explicit inline closed_view(Range const& r)
0078 : closing_view<Range const>(r)
0079 {}
0080 };
0081
0082
0083 }
0084 #endif
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100 template <typename Range, closure_selector Close>
0101 struct closeable_view {};
0102
0103
0104 #ifndef DOXYGEN_NO_SPECIALIZATIONS
0105
0106 template <typename Range>
0107 struct closeable_view<Range, closed>
0108 {
0109 using type = identity_view<Range>;
0110 };
0111
0112
0113 template <typename Range>
0114 struct closeable_view<Range, open>
0115 {
0116 using type = detail::closing_view<Range>;
0117 };
0118
0119 #endif
0120
0121
0122 #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
0123 namespace traits
0124 {
0125
0126
0127 template <typename Range, closure_selector Close>
0128 struct tag<geometry::detail::closed_view<Range, Close> >
0129 : geometry::tag<Range>
0130 {};
0131
0132 template <typename Range, closure_selector Close>
0133 struct point_order<geometry::detail::closed_view<Range, Close> >
0134 : geometry::point_order<Range>
0135 {};
0136
0137 template <typename Range, closure_selector Close>
0138 struct closure<geometry::detail::closed_view<Range, Close> >
0139 {
0140 static const closure_selector value = closed;
0141 };
0142
0143
0144 }
0145 #endif
0146
0147
0148 }}
0149
0150
0151 #endif