Chris@102
|
1 /* Copyright 2003-2014 Joaquin M Lopez Munoz.
|
Chris@102
|
2 * Distributed under the Boost Software License, Version 1.0.
|
Chris@102
|
3 * (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@102
|
4 * http://www.boost.org/LICENSE_1_0.txt)
|
Chris@102
|
5 *
|
Chris@102
|
6 * See http://www.boost.org/libs/multi_index for library home page.
|
Chris@102
|
7 */
|
Chris@102
|
8
|
Chris@102
|
9 #ifndef BOOST_MULTI_INDEX_DETAIL_CONS_STDTUPLE_HPP
|
Chris@102
|
10 #define BOOST_MULTI_INDEX_DETAIL_CONS_STDTUPLE_HPP
|
Chris@102
|
11
|
Chris@102
|
12 #if defined(_MSC_VER)
|
Chris@102
|
13 #pragma once
|
Chris@102
|
14 #endif
|
Chris@102
|
15
|
Chris@102
|
16 #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
Chris@102
|
17 #include <boost/mpl/if.hpp>
|
Chris@102
|
18 #include <boost/tuple/tuple.hpp>
|
Chris@102
|
19 #include <tuple>
|
Chris@102
|
20
|
Chris@102
|
21 namespace boost{
|
Chris@102
|
22
|
Chris@102
|
23 namespace multi_index{
|
Chris@102
|
24
|
Chris@102
|
25 namespace detail{
|
Chris@102
|
26
|
Chris@102
|
27 /* std::tuple wrapper providing the cons-based interface of boost::tuple for
|
Chris@102
|
28 * composite_key interoperability.
|
Chris@102
|
29 */
|
Chris@102
|
30
|
Chris@102
|
31 template<typename StdTuple,std::size_t N>
|
Chris@102
|
32 struct cons_stdtuple;
|
Chris@102
|
33
|
Chris@102
|
34 struct cons_stdtuple_ctor_terminal
|
Chris@102
|
35 {
|
Chris@102
|
36 typedef boost::tuples::null_type result_type;
|
Chris@102
|
37
|
Chris@102
|
38 template<typename StdTuple>
|
Chris@102
|
39 static result_type create(const StdTuple&)
|
Chris@102
|
40 {
|
Chris@102
|
41 return boost::tuples::null_type();
|
Chris@102
|
42 }
|
Chris@102
|
43 };
|
Chris@102
|
44
|
Chris@102
|
45 template<typename StdTuple,std::size_t N>
|
Chris@102
|
46 struct cons_stdtuple_ctor_normal
|
Chris@102
|
47 {
|
Chris@102
|
48 typedef cons_stdtuple<StdTuple,N> result_type;
|
Chris@102
|
49
|
Chris@102
|
50 static result_type create(const StdTuple& t)
|
Chris@102
|
51 {
|
Chris@102
|
52 return result_type(t);
|
Chris@102
|
53 }
|
Chris@102
|
54 };
|
Chris@102
|
55
|
Chris@102
|
56 template<typename StdTuple,std::size_t N=0>
|
Chris@102
|
57 struct cons_stdtuple_ctor:
|
Chris@102
|
58 boost::mpl::if_c<
|
Chris@102
|
59 N<std::tuple_size<StdTuple>::value,
|
Chris@102
|
60 cons_stdtuple_ctor_normal<StdTuple,N>,
|
Chris@102
|
61 cons_stdtuple_ctor_terminal
|
Chris@102
|
62 >::type
|
Chris@102
|
63 {};
|
Chris@102
|
64
|
Chris@102
|
65 template<typename StdTuple,std::size_t N>
|
Chris@102
|
66 struct cons_stdtuple
|
Chris@102
|
67 {
|
Chris@102
|
68 typedef typename std::tuple_element<N,StdTuple>::type head_type;
|
Chris@102
|
69 typedef cons_stdtuple_ctor<StdTuple,N+1> tail_ctor;
|
Chris@102
|
70 typedef typename tail_ctor::result_type tail_type;
|
Chris@102
|
71
|
Chris@102
|
72 cons_stdtuple(const StdTuple& t_):t(t_){}
|
Chris@102
|
73
|
Chris@102
|
74 const head_type& get_head()const{return std::get<N>(t);}
|
Chris@102
|
75 tail_type get_tail()const{return tail_ctor::create(t);}
|
Chris@102
|
76
|
Chris@102
|
77 const StdTuple& t;
|
Chris@102
|
78 };
|
Chris@102
|
79
|
Chris@102
|
80 template<typename StdTuple>
|
Chris@102
|
81 typename cons_stdtuple_ctor<StdTuple>::result_type
|
Chris@102
|
82 make_cons_stdtuple(const StdTuple& t)
|
Chris@102
|
83 {
|
Chris@102
|
84 return cons_stdtuple_ctor<StdTuple>::create(t);
|
Chris@102
|
85 }
|
Chris@102
|
86
|
Chris@102
|
87 } /* namespace multi_index::detail */
|
Chris@102
|
88
|
Chris@102
|
89 } /* namespace multi_index */
|
Chris@102
|
90
|
Chris@102
|
91 } /* namespace boost */
|
Chris@102
|
92
|
Chris@102
|
93 #endif
|