Chris@16: // Boost.Geometry Index Chris@16: // Chris@16: // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland. Chris@16: // Chris@16: // Use, modification and distribution is subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GEOMETRY_INDEX_DETAIL_TUPLES_HPP Chris@16: #define BOOST_GEOMETRY_INDEX_DETAIL_TUPLES_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: // TODO move this to index/tuples and separate algorithms Chris@16: Chris@16: namespace boost { namespace geometry { namespace index { namespace detail { Chris@16: Chris@16: namespace tuples { Chris@16: Chris@16: // find_index Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: template Chris@16: struct find_index; Chris@16: Chris@16: template Chris@16: struct find_index_impl Chris@16: { Chris@16: static const size_t value = find_index::value; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct find_index_impl Chris@16: { Chris@16: static const size_t value = N - 1; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct find_index_impl Chris@16: { Chris@16: BOOST_MPL_ASSERT_MSG( Chris@16: (false), Chris@16: ELEMENT_NOT_FOUND, Chris@16: (find_index_impl)); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct find_index_impl Chris@16: { Chris@16: static const size_t value = 0; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct find_index Chris@16: { Chris@16: static const size_t value = Chris@16: find_index_impl< Chris@16: Tuple, Chris@16: El, Chris@16: N, Chris@16: typename boost::tuples::element::type Chris@16: >::value; Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: template Chris@16: struct find_index Chris@16: { Chris@16: static const size_t value = Chris@16: detail::find_index< Chris@16: Tuple, Chris@16: El, Chris@16: boost::tuples::length::value Chris@16: >::value; Chris@16: }; Chris@16: Chris@16: // has Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: template Chris@16: struct has Chris@16: { Chris@16: static const bool value Chris@16: = boost::is_same< Chris@16: typename boost::tuples::element::type, Chris@16: El Chris@16: >::value Chris@16: || has::value; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct has Chris@16: { Chris@16: static const bool value Chris@16: = boost::is_same< Chris@16: typename boost::tuples::element<0, Tuple>::type, Chris@16: El Chris@16: >::value; Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: template Chris@16: struct has Chris@16: { Chris@16: static const bool value Chris@16: = detail::has< Chris@16: Tuple, Chris@16: El, Chris@16: boost::tuples::length::value Chris@16: >::value; Chris@16: }; Chris@16: Chris@16: // add Chris@16: Chris@16: template Chris@16: struct add Chris@16: { Chris@16: BOOST_MPL_ASSERT_MSG( Chris@16: (false), Chris@16: NOT_IMPLEMENTED_FOR_THIS_TUPLE_TYPE, Chris@16: (add)); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct add, T> Chris@16: { Chris@16: typedef boost::tuple type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct add, T> Chris@16: { Chris@16: typedef boost::tuple type; Chris@16: }; Chris@16: Chris@16: // add_if Chris@16: Chris@16: template Chris@16: struct add_if Chris@16: { Chris@16: typedef Tuple type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct add_if Chris@16: { Chris@16: typedef typename add::type type; Chris@16: }; Chris@16: Chris@16: // add_unique Chris@16: Chris@16: template Chris@16: struct add_unique Chris@16: { Chris@16: typedef typename add_if< Chris@16: Tuple, Chris@16: El, Chris@16: !has::value Chris@16: >::type type; Chris@16: }; Chris@16: Chris@101: template ::value> Chris@101: struct push_back Chris@16: { Chris@16: typedef Chris@16: boost::tuples::cons< Chris@16: typename boost::tuples::element::type, Chris@101: typename push_back::type Chris@16: > type; Chris@16: Chris@16: static type apply(Tuple const& tup, T const& t) Chris@16: { Chris@16: return Chris@16: type( Chris@16: boost::get(tup), Chris@101: push_back::apply(tup, t) Chris@16: ); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@101: struct push_back Chris@16: { Chris@16: typedef boost::tuples::cons type; Chris@16: Chris@16: static type apply(Tuple const&, T const& t) Chris@16: { Chris@16: return type(t, boost::tuples::null_type()); Chris@16: } Chris@16: }; Chris@16: Chris@16: } // namespace tuples Chris@16: Chris@16: }}}} // namespace boost::geometry::index::detail Chris@16: Chris@16: #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_TAGS_HPP