1// Boost.Geometry Index
2//
3// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
4//
5// Use, modification and distribution is subject to the Boost Software License,
6// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8
9#ifndef BOOST_GEOMETRY_INDEX_DETAIL_TUPLES_HPP
10#define BOOST_GEOMETRY_INDEX_DETAIL_TUPLES_HPP
11
12#include <boost/tuple/tuple.hpp>
13#include <boost/type_traits/is_same.hpp>
14
15// TODO move this to index/tuples and separate algorithms
16
17namespace boost { namespace geometry { namespace index { namespace detail {
18
19namespace tuples {
20
21// find_index
22
23namespace detail {
24
25template <typename Tuple, typename El, size_t N>
26struct find_index;
27
28template <typename Tuple, typename El, size_t N, typename CurrentEl>
29struct find_index_impl
30{
31 static const size_t value = find_index<Tuple, El, N - 1>::value;
32};
33
34template <typename Tuple, typename El, size_t N>
35struct find_index_impl<Tuple, El, N, El>
36{
37 static const size_t value = N - 1;
38};
39
40template <typename Tuple, typename El, typename CurrentEl>
41struct find_index_impl<Tuple, El, 1, CurrentEl>
42{
43 BOOST_MPL_ASSERT_MSG(
44 (false),
45 ELEMENT_NOT_FOUND,
46 (find_index_impl));
47};
48
49template <typename Tuple, typename El>
50struct find_index_impl<Tuple, El, 1, El>
51{
52 static const size_t value = 0;
53};
54
55template <typename Tuple, typename El, size_t N>
56struct find_index
57{
58 static const size_t value =
59 find_index_impl<
60 Tuple,
61 El,
62 N,
63 typename boost::tuples::element<N - 1, Tuple>::type
64 >::value;
65};
66
67} // namespace detail
68
69template <typename Tuple, typename El>
70struct find_index
71{
72 static const size_t value =
73 detail::find_index<
74 Tuple,
75 El,
76 boost::tuples::length<Tuple>::value
77 >::value;
78};
79
80// has
81
82namespace detail {
83
84template <typename Tuple, typename El, size_t N>
85struct has
86{
87 static const bool value
88 = boost::is_same<
89 typename boost::tuples::element<N - 1, Tuple>::type,
90 El
91 >::value
92 || has<Tuple, El, N - 1>::value;
93};
94
95template <typename Tuple, typename El>
96struct has<Tuple, El, 1>
97{
98 static const bool value
99 = boost::is_same<
100 typename boost::tuples::element<0, Tuple>::type,
101 El
102 >::value;
103};
104
105} // namespace detail
106
107template <typename Tuple, typename El>
108struct has
109{
110 static const bool value
111 = detail::has<
112 Tuple,
113 El,
114 boost::tuples::length<Tuple>::value
115 >::value;
116};
117
118// add
119
120template <typename Tuple, typename El>
121struct add
122{
123 BOOST_MPL_ASSERT_MSG(
124 (false),
125 NOT_IMPLEMENTED_FOR_THIS_TUPLE_TYPE,
126 (add));
127};
128
129template <typename T1, typename T>
130struct add<boost::tuple<T1>, T>
131{
132 typedef boost::tuple<T1, T> type;
133};
134
135template <typename T1, typename T2, typename T>
136struct add<boost::tuple<T1, T2>, T>
137{
138 typedef boost::tuple<T1, T2, T> type;
139};
140
141// add_if
142
143template <typename Tuple, typename El, bool Cond>
144struct add_if
145{
146 typedef Tuple type;
147};
148
149template <typename Tuple, typename El>
150struct add_if<Tuple, El, true>
151{
152 typedef typename add<Tuple, El>::type type;
153};
154
155// add_unique
156
157template <typename Tuple, typename El>
158struct add_unique
159{
160 typedef typename add_if<
161 Tuple,
162 El,
163 !has<Tuple, El>::value
164 >::type type;
165};
166
167template <typename Tuple,
168 typename T,
169 size_t I = 0,
170 size_t N = boost::tuples::length<Tuple>::value>
171struct push_back
172{
173 typedef
174 boost::tuples::cons<
175 typename boost::tuples::element<I, Tuple>::type,
176 typename push_back<Tuple, T, I+1, N>::type
177 > type;
178
179 static type apply(Tuple const& tup, T const& t)
180 {
181 return
182 type(
183 boost::get<I>(tup),
184 push_back<Tuple, T, I+1, N>::apply(tup, t)
185 );
186 }
187};
188
189template <typename Tuple, typename T, size_t N>
190struct push_back<Tuple, T, N, N>
191{
192 typedef boost::tuples::cons<T, boost::tuples::null_type> type;
193
194 static type apply(Tuple const&, T const& t)
195 {
196 return type(t, boost::tuples::null_type());
197 }
198};
199
200} // namespace tuples
201
202}}}} // namespace boost::geometry::index::detail
203
204#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_TAGS_HPP
205

source code of boost/boost/geometry/index/detail/tuples.hpp