]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/geometry/include/boost/geometry/iterators/detail/segment_iterator/value_type.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / geometry / include / boost / geometry / iterators / detail / segment_iterator / value_type.hpp
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2
3 // Copyright (c) 2014-2015, Oracle and/or its affiliates.
4
5 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
6
7 // Licensed under the Boost Software License version 1.0.
8 // http://www.boost.org/users/license.html
9
10 #ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_VALUE_TYPE_HPP
11 #define BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_VALUE_TYPE_HPP
12
13 #include <iterator>
14
15 #include <boost/mpl/if.hpp>
16 #include <boost/type_traits/is_reference.hpp>
17
18 #include <boost/geometry/iterators/point_iterator.hpp>
19 #include <boost/geometry/util/bare_type.hpp>
20 #include <boost/geometry/geometries/segment.hpp>
21 #include <boost/geometry/geometries/pointing_segment.hpp>
22
23
24 namespace boost { namespace geometry
25 {
26
27 #ifndef DOXYGEN_NO_DETAIL
28 namespace detail { namespace segment_iterator
29 {
30
31 template <typename Geometry>
32 struct value_type
33 {
34 typedef typename std::iterator_traits
35 <
36 geometry::point_iterator<Geometry>
37 >::reference point_iterator_reference_type;
38
39 typedef typename detail::point_iterator::value_type
40 <
41 Geometry
42 >::type point_iterator_value_type;
43
44 // If the reference type of the point iterator is not really a
45 // reference, then dereferencing a point iterator would create
46 // a temporary object.
47 // In this case using a pointing_segment to represent the
48 // dereferenced value of the segment iterator cannot be used, as
49 // it would store pointers to temporary objects. Instead we use a
50 // segment, which does a full copy of the temporary objects
51 // returned by the point iterator.
52 typedef typename boost::mpl::if_
53 <
54 boost::is_reference<point_iterator_reference_type>,
55 geometry::model::pointing_segment<point_iterator_value_type>,
56 geometry::model::segment
57 <
58 typename geometry::util::bare_type
59 <
60 point_iterator_value_type
61 >::type
62 >
63 >::type type;
64 };
65
66 }} // namespace detail::segment_iterator
67 #endif // DOXYGEN_NO_DETAIL
68
69 }} // namespace boost::geometry
70
71 #endif // BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_VALUE_TYPE_HPP