1 /* Boost.MultiIndex test for terse key specification syntax.
2  *
3  * Copyright 2003-2019 Joaquin M Lopez Munoz.
4  * Distributed under the Boost Software License, Version 1.0.
5  * (See accompanying file LICENSE_1_0.txt or copy at
6  * http://www.boost.org/LICENSE_1_0.txt)
7  *
8  * See http://www.boost.org/libs/multi_index for library home page.
9  */
10 
11 #include "test_key.hpp"
12 
13 #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
14 #include <boost/detail/lightweight_test.hpp>
15 #include "pre_multi_index.hpp"
16 #include <boost/multi_index/key.hpp>
17 
18 #if !defined(BOOST_MULTI_INDEX_KEY_SUPPORTED)
19 
20 #include <boost/config/pragma_message.hpp>
21 
22 BOOST_PRAGMA_MESSAGE("boost::multi_index::key not supported, skipping test")
23 
test_key()24 void test_key()
25 {
26 }
27 #else
28 
29 #include <functional>
30 #include <type_traits>
31 
32 using namespace boost::multi_index;
33 
34 namespace {
35 
36 struct base
37 {
38   int       x;
39   const int cx;
f__anon76fb8ffd0111::base40   int       f(){return x;};
cf__anon76fb8ffd0111::base41   int       cf()const{return x;};
vf__anon76fb8ffd0111::base42   int       vf()volatile{return x;};
cvf__anon76fb8ffd0111::base43   int       cvf()const volatile{return x;};
rf__anon76fb8ffd0111::base44   int       rf()&{return x;};
crf__anon76fb8ffd0111::base45   int       crf()const&{return x;};
vrf__anon76fb8ffd0111::base46   int       vrf()volatile&{return x;};
cvrf__anon76fb8ffd0111::base47   int       cvrf()const volatile&{return x;};
nef__anon76fb8ffd0111::base48   int       nef()noexcept{return x;};
cnef__anon76fb8ffd0111::base49   int       cnef()const noexcept{return x;};
vnef__anon76fb8ffd0111::base50   int       vnef()volatile noexcept{return x;};
cvnef__anon76fb8ffd0111::base51   int       cvnef()const volatile noexcept{return x;};
rnef__anon76fb8ffd0111::base52   int       rnef()& noexcept{return x;};
crnef__anon76fb8ffd0111::base53   int       crnef()const& noexcept{return x;};
vrnef__anon76fb8ffd0111::base54   int       vrnef()volatile& noexcept{return x;};
cvrnef__anon76fb8ffd0111::base55   int       cvrnef()const volatile& noexcept{return x;};
56 };
57 
gf(const base & b)58 int gf(const base& b){return b.x;}
negf(const base & b)59 int negf(const base& b)noexcept{return b.x;}
60 
61 struct derived:base
62 {
63   int y;
64 };
65 
gh(derived & d)66 int gh(derived& d){return d.y;}
grh(std::reference_wrapper<derived> & d)67 int grh(std::reference_wrapper<derived>& d){return d.get().y;}
68 
69 } /* namespace */
70 
test_key()71 void test_key()
72 {
73   BOOST_TEST((std::is_same<
74     key<&base::x>,member<base,int,&base::x>
75   >::value));
76   BOOST_TEST((std::is_same<
77     key<&base::cx>,member<base,const int,&base::cx>
78   >::value));
79   BOOST_TEST((std::is_same<
80     key<&base::f>,mem_fun<base,int,&base::f>
81   >::value));
82   BOOST_TEST((std::is_same<
83     key<&base::cf>,const_mem_fun<base,int,&base::cf>
84   >::value));
85   BOOST_TEST((std::is_same<
86     key<&base::vf>,volatile_mem_fun<base,int,&base::vf>
87   >::value));
88   BOOST_TEST((std::is_same<
89     key<&base::cvf>,cv_mem_fun<base,int,&base::cvf>
90   >::value));
91   BOOST_TEST((std::is_same<
92     key<&base::rf>,ref_mem_fun<base,int,&base::rf>
93   >::value));
94   BOOST_TEST((std::is_same<
95     key<&base::crf>,cref_mem_fun<base,int,&base::crf>
96   >::value));
97   BOOST_TEST((std::is_same<
98     key<&base::vrf>,vref_mem_fun<base,int,&base::vrf>
99   >::value));
100   BOOST_TEST((std::is_same<
101     key<&base::cvrf>,cvref_mem_fun<base,int,&base::cvrf>
102   >::value));
103   BOOST_TEST((std::is_same<
104     key<&base::nef>,mem_fun<base,int,&base::nef>
105   >::value));
106   BOOST_TEST((std::is_same<
107     key<&base::cnef>,const_mem_fun<base,int,&base::cnef>
108   >::value));
109   BOOST_TEST((std::is_same<
110     key<&base::vnef>,volatile_mem_fun<base,int,&base::vnef>
111   >::value));
112   BOOST_TEST((std::is_same<
113     key<&base::cvnef>,cv_mem_fun<base,int,&base::cvnef>
114   >::value));
115   BOOST_TEST((std::is_same<
116     key<&base::rnef>,ref_mem_fun<base,int,&base::rnef>
117   >::value));
118   BOOST_TEST((std::is_same<
119     key<&base::crnef>,cref_mem_fun<base,int,&base::crnef>
120   >::value));
121   BOOST_TEST((std::is_same<
122     key<&base::vrnef>,vref_mem_fun<base,int,&base::vrnef>
123   >::value));
124   BOOST_TEST((std::is_same<
125     key<&base::cvrnef>,cvref_mem_fun<base,int,&base::cvrnef>
126   >::value));
127   BOOST_TEST((std::is_same<
128     key<gf>,global_fun<const base&,int,gf>
129   >::value));
130   BOOST_TEST((std::is_same<
131     key<negf>,global_fun<const base&,int,negf>
132   >::value));
133   BOOST_TEST((std::is_same<
134     key<&base::x,&base::cx,&base::f,&base::cf,gf>,
135     composite_key<
136       base,
137       member<base,int,&base::x>,
138       member<base,const int,&base::cx>,
139       mem_fun<base,int,&base::f>,
140       const_mem_fun<base,int,&base::cf>,
141       global_fun<const base&,int,gf>
142     >
143   >::value));
144   BOOST_TEST((std::is_same<
145     key<&base::x,&derived::y>,
146     composite_key<
147       derived,
148       member<base,int,&base::x>,
149       member<derived,int,&derived::y>
150     >
151   >::value));
152   BOOST_TEST((std::is_same<
153     key<gf,gh>,
154     composite_key<
155       derived,
156       global_fun<const base&,int,gf>,
157       global_fun<derived&,int,gh>
158     >
159   >::value));
160   BOOST_TEST((std::is_same<
161     key<gf,gh,grh>,
162     composite_key<
163       std::reference_wrapper<derived>,
164       global_fun<const base&,int,gf>,
165       global_fun<derived&,int,gh>,
166       global_fun<std::reference_wrapper<derived>&,int,grh>
167     >
168   >::value));
169 }
170 #endif
171