| /* Copyright 2003-2014 Joaquin M Lopez Munoz. |
| * Distributed under the Boost Software License, Version 1.0. |
| * (See accompanying file LICENSE_1_0.txt or copy at |
| * http://www.boost.org/LICENSE_1_0.txt) |
| * |
| * See http://www.boost.org/libs/multi_index for library home page. |
| */ |
| |
| #ifndef BOOST_MULTI_INDEX_DETAIL_CONS_STDTUPLE_HPP |
| #define BOOST_MULTI_INDEX_DETAIL_CONS_STDTUPLE_HPP |
| |
| #if defined(_MSC_VER) |
| #pragma once |
| #endif |
| |
| #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */ |
| #include <boost/mpl/if.hpp> |
| #include <boost/tuple/tuple.hpp> |
| #include <tuple> |
| |
| namespace boost{ |
| |
| namespace multi_index{ |
| |
| namespace detail{ |
| |
| /* std::tuple wrapper providing the cons-based interface of boost::tuple for |
| * composite_key interoperability. |
| */ |
| |
| template<typename StdTuple,std::size_t N> |
| struct cons_stdtuple; |
| |
| struct cons_stdtuple_ctor_terminal |
| { |
| typedef boost::tuples::null_type result_type; |
| |
| template<typename StdTuple> |
| static result_type create(const StdTuple&) |
| { |
| return boost::tuples::null_type(); |
| } |
| }; |
| |
| template<typename StdTuple,std::size_t N> |
| struct cons_stdtuple_ctor_normal |
| { |
| typedef cons_stdtuple<StdTuple,N> result_type; |
| |
| static result_type create(const StdTuple& t) |
| { |
| return result_type(t); |
| } |
| }; |
| |
| template<typename StdTuple,std::size_t N=0> |
| struct cons_stdtuple_ctor: |
| boost::mpl::if_c< |
| N<std::tuple_size<StdTuple>::value, |
| cons_stdtuple_ctor_normal<StdTuple,N>, |
| cons_stdtuple_ctor_terminal |
| >::type |
| {}; |
| |
| template<typename StdTuple,std::size_t N> |
| struct cons_stdtuple |
| { |
| typedef typename std::tuple_element<N,StdTuple>::type head_type; |
| typedef cons_stdtuple_ctor<StdTuple,N+1> tail_ctor; |
| typedef typename tail_ctor::result_type tail_type; |
| |
| cons_stdtuple(const StdTuple& t_):t(t_){} |
| |
| const head_type& get_head()const{return std::get<N>(t);} |
| tail_type get_tail()const{return tail_ctor::create(t);} |
| |
| const StdTuple& t; |
| }; |
| |
| template<typename StdTuple> |
| typename cons_stdtuple_ctor<StdTuple>::result_type |
| make_cons_stdtuple(const StdTuple& t) |
| { |
| return cons_stdtuple_ctor<StdTuple>::create(t); |
| } |
| |
| } /* namespace multi_index::detail */ |
| |
| } /* namespace multi_index */ |
| |
| } /* namespace boost */ |
| |
| #endif |