]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/geometry/include/boost/geometry/index/detail/rtree/node/variant_static.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / geometry / include / boost / geometry / index / detail / rtree / node / variant_static.hpp
1 // Boost.Geometry Index
2 //
3 // R-tree nodes based on Boost.Variant, storing static-size containers
4 //
5 // Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
6 //
7 // Use, modification and distribution is subject to the Boost Software License,
8 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10
11 #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_VARIANT_STATIC_HPP
12 #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_VARIANT_STATIC_HPP
13
14 namespace boost { namespace geometry { namespace index {
15
16 namespace detail { namespace rtree {
17
18 // nodes default types
19
20 template <typename Value, typename Parameters, typename Box, typename Allocators>
21 struct variant_internal_node<Value, Parameters, Box, Allocators, node_variant_static_tag>
22 {
23 typedef detail::varray<
24 rtree::ptr_pair<Box, typename Allocators::node_pointer>,
25 Parameters::max_elements + 1
26 > elements_type;
27
28 template <typename Alloc>
29 inline variant_internal_node(Alloc const&) {}
30
31 elements_type elements;
32 };
33
34 template <typename Value, typename Parameters, typename Box, typename Allocators>
35 struct variant_leaf<Value, Parameters, Box, Allocators, node_variant_static_tag>
36 {
37 typedef detail::varray<
38 Value,
39 Parameters::max_elements + 1
40 > elements_type;
41
42 template <typename Alloc>
43 inline variant_leaf(Alloc const&) {}
44
45 elements_type elements;
46 };
47
48 // nodes traits
49
50 template <typename Value, typename Parameters, typename Box, typename Allocators>
51 struct node<Value, Parameters, Box, Allocators, node_variant_static_tag>
52 {
53 typedef boost::variant<
54 variant_leaf<Value, Parameters, Box, Allocators, node_variant_static_tag>,
55 variant_internal_node<Value, Parameters, Box, Allocators, node_variant_static_tag>
56 > type;
57 };
58
59 template <typename Value, typename Parameters, typename Box, typename Allocators>
60 struct internal_node<Value, Parameters, Box, Allocators, node_variant_static_tag>
61 {
62 typedef variant_internal_node<Value, Parameters, Box, Allocators, node_variant_static_tag> type;
63 };
64
65 template <typename Value, typename Parameters, typename Box, typename Allocators>
66 struct leaf<Value, Parameters, Box, Allocators, node_variant_static_tag>
67 {
68 typedef variant_leaf<Value, Parameters, Box, Allocators, node_variant_static_tag> type;
69 };
70
71 // visitor traits
72
73 template <typename Value, typename Parameters, typename Box, typename Allocators, bool IsVisitableConst>
74 struct visitor<Value, Parameters, Box, Allocators, node_variant_static_tag, IsVisitableConst>
75 {
76 typedef static_visitor<> type;
77 };
78
79 // allocators
80
81 template <typename Allocator, typename Value, typename Parameters, typename Box>
82 class allocators<Allocator, Value, Parameters, Box, node_variant_static_tag>
83 : public Allocator::template rebind<
84 typename node<
85 Value, Parameters, Box,
86 allocators<Allocator, Value, Parameters, Box, node_variant_static_tag>,
87 node_variant_static_tag
88 >::type
89 >::other
90 {
91 typedef typename Allocator::template rebind<
92 Value
93 >::other value_allocator_type;
94
95 public:
96 typedef Allocator allocator_type;
97
98 typedef Value value_type;
99 typedef value_type & reference;
100 typedef const value_type & const_reference;
101 typedef typename value_allocator_type::size_type size_type;
102 typedef typename value_allocator_type::difference_type difference_type;
103 typedef typename value_allocator_type::pointer pointer;
104 typedef typename value_allocator_type::const_pointer const_pointer;
105
106 typedef typename Allocator::template rebind<
107 typename node<Value, Parameters, Box, allocators, node_variant_static_tag>::type
108 >::other::pointer node_pointer;
109
110 typedef typename Allocator::template rebind<
111 typename node<Value, Parameters, Box, allocators, node_variant_static_tag>::type
112 >::other node_allocator_type;
113
114 inline allocators()
115 : node_allocator_type()
116 {}
117
118 template <typename Alloc>
119 inline explicit allocators(Alloc const& alloc)
120 : node_allocator_type(alloc)
121 {}
122
123 inline allocators(BOOST_FWD_REF(allocators) a)
124 : node_allocator_type(boost::move(a.node_allocator()))
125 {}
126
127 inline allocators & operator=(BOOST_FWD_REF(allocators) a)
128 {
129 node_allocator() = boost::move(a.node_allocator());
130 return *this;
131 }
132
133 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
134 inline allocators & operator=(allocators const& a)
135 {
136 node_allocator() = a.node_allocator();
137 return *this;
138 }
139 #endif
140
141 void swap(allocators & a)
142 {
143 boost::swap(node_allocator(), a.node_allocator());
144 }
145
146 bool operator==(allocators const& a) const { return node_allocator() == a.node_allocator(); }
147 template <typename Alloc>
148 bool operator==(Alloc const& a) const { return node_allocator() == node_allocator_type(a); }
149
150 Allocator allocator() const { return Allocator(node_allocator()); }
151
152 node_allocator_type & node_allocator() { return *this; }
153 node_allocator_type const& node_allocator() const { return *this; }
154 };
155
156 }} // namespace detail::rtree
157
158 }}} // namespace boost::geometry::index
159
160 #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_VARIANT_STATIC_HPP