1 // Boost.Geometry Index
3 // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
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)
9 #ifndef BOOST_GEOMETRY_INDEX_DETAIL_TUPLES_HPP
10 #define BOOST_GEOMETRY_INDEX_DETAIL_TUPLES_HPP
12 #include <boost/tuple/tuple.hpp>
13 #include <boost/type_traits/is_same.hpp>
15 // TODO move this to index/tuples and separate algorithms
17 namespace boost { namespace geometry { namespace index { namespace detail {
25 template <typename Tuple, typename El, size_t N>
28 template <typename Tuple, typename El, size_t N, typename CurrentEl>
29 struct find_index_impl
31 static const size_t value = find_index<Tuple, El, N - 1>::value;
34 template <typename Tuple, typename El, size_t N>
35 struct find_index_impl<Tuple, El, N, El>
37 static const size_t value = N - 1;
40 template <typename Tuple, typename El, typename CurrentEl>
41 struct find_index_impl<Tuple, El, 1, CurrentEl>
49 template <typename Tuple, typename El>
50 struct find_index_impl<Tuple, El, 1, El>
52 static const size_t value = 0;
55 template <typename Tuple, typename El, size_t N>
58 static const size_t value =
63 typename boost::tuples::element<N - 1, Tuple>::type
69 template <typename Tuple, typename El>
72 static const size_t value =
76 boost::tuples::length<Tuple>::value
84 template <typename Tuple, typename El, size_t N>
87 static const bool value
89 typename boost::tuples::element<N - 1, Tuple>::type,
92 || has<Tuple, El, N - 1>::value;
95 template <typename Tuple, typename El>
96 struct has<Tuple, El, 1>
98 static const bool value
100 typename boost::tuples::element<0, Tuple>::type,
105 } // namespace detail
107 template <typename Tuple, typename El>
110 static const bool value
114 boost::tuples::length<Tuple>::value
120 template <typename Tuple, typename El>
123 BOOST_MPL_ASSERT_MSG(
125 NOT_IMPLEMENTED_FOR_THIS_TUPLE_TYPE,
129 template <typename T1, typename T>
130 struct add<boost::tuple<T1>, T>
132 typedef boost::tuple<T1, T> type;
135 template <typename T1, typename T2, typename T>
136 struct add<boost::tuple<T1, T2>, T>
138 typedef boost::tuple<T1, T2, T> type;
143 template <typename Tuple, typename El, bool Cond>
149 template <typename Tuple, typename El>
150 struct add_if<Tuple, El, true>
152 typedef typename add<Tuple, El>::type type;
157 template <typename Tuple, typename El>
160 typedef typename add_if<
163 !has<Tuple, El>::value
167 template <typename Tuple,
170 size_t N = boost::tuples::length<Tuple>::value>
175 typename boost::tuples::element<I, Tuple>::type,
176 typename push_back<Tuple, T, I+1, N>::type
179 static type apply(Tuple const& tup, T const& t)
184 push_back<Tuple, T, I+1, N>::apply(tup, t)
189 template <typename Tuple, typename T, size_t N>
190 struct push_back<Tuple, T, N, N>
192 typedef boost::tuples::cons<T, boost::tuples::null_type> type;
194 static type apply(Tuple const&, T const& t)
196 return type(t, boost::tuples::null_type());
200 } // namespace tuples
202 }}}} // namespace boost::geometry::index::detail
204 #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_TAGS_HPP