1/* Boost.MultiIndex test for projection capabilities.
2 *
3 * Copyright 2003-2013 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_projection.hpp"
12
13#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
14#include "pre_multi_index.hpp"
15#include "employee.hpp"
16#include <boost/detail/lightweight_test.hpp>
17
18using namespace boost::multi_index;
19
20void test_projection()
21{
22 employee_set es;
23 es.insert(x: employee(0,"Joe",31,1123));
24 es.insert(x: employee(1,"Robert",27,5601));
25 es.insert(x: employee(2,"John",40,7889));
26 es.insert(x: employee(3,"Albert",20,9012));
27 es.insert(x: employee(4,"John",57,1002));
28
29 employee_set::iterator it,itbis;
30 employee_set_by_name::iterator it1;
31 employee_set_by_age::iterator it2;
32 employee_set_as_inserted::iterator it3;
33 employee_set_by_ssn::iterator it4;
34 employee_set_randomly::iterator it5;
35
36 BOOST_STATIC_ASSERT((boost::is_same<
37 employee_set::iterator,
38 nth_index_iterator<employee_set,0>::type >::value));
39 BOOST_STATIC_ASSERT((boost::is_same<
40 employee_set_by_name::iterator,
41 nth_index_iterator<employee_set,1>::type >::value));
42#if defined(BOOST_NO_MEMBER_TEMPLATES)
43 BOOST_STATIC_ASSERT((boost::is_same<
44 employee_set_by_age::iterator,
45 index_iterator<employee_set,age>::type >::value));
46#else
47 BOOST_STATIC_ASSERT((boost::is_same<
48 employee_set_by_age::iterator,
49 employee_set::index_iterator<age>::type >::value));
50#endif
51 BOOST_STATIC_ASSERT((boost::is_same<
52 employee_set_as_inserted::iterator,
53 nth_index_iterator<employee_set,3>::type >::value));
54 BOOST_STATIC_ASSERT((boost::is_same<
55 employee_set_by_ssn::iterator,
56 nth_index_iterator<employee_set,4>::type >::value));
57 BOOST_STATIC_ASSERT((boost::is_same<
58 employee_set_randomly::iterator,
59 nth_index_iterator<employee_set,5>::type >::value));
60
61 it= es.find(x: employee(1,"Robert",27,5601));
62 it1= project<name>(m&: es,it);
63 it2= project<age>(m&: es,it: it1);
64 it3= project<as_inserted>(m&: es,it: it2);
65 it4= project<ssn>(m&: es,it: it3);
66 it5= project<randomly>(m&: es,it: it4);
67#if defined(BOOST_NO_MEMBER_TEMPLATES)
68 itbis=project<0>(es,it5);
69#else
70 itbis=es.project<0>(it: it5);
71#endif
72
73 BOOST_TEST(
74 *it==*it1&&*it1==*it2&&*it2==*it3&&*it3==*it4&&*it4==*it5&&itbis==it);
75
76 BOOST_TEST(project<name>(es,es.end())==get<name>(es).end());
77 BOOST_TEST(project<age>(es,es.end())==get<age>(es).end());
78 BOOST_TEST(project<as_inserted>(es,es.end())==get<as_inserted>(es).end());
79 BOOST_TEST(project<ssn>(es,es.end())==get<ssn>(es).end());
80 BOOST_TEST(project<randomly>(es,es.end())==get<randomly>(es).end());
81
82 const employee_set& ces=es;
83
84 employee_set::const_iterator cit,citbis;
85 employee_set_by_name::const_iterator cit1;
86 employee_set_by_age::const_iterator cit2;
87 employee_set_as_inserted::const_iterator cit3;
88 employee_set_by_ssn::const_iterator cit4;
89 employee_set_randomly::const_iterator cit5;
90
91 BOOST_STATIC_ASSERT((boost::is_same<
92 employee_set::const_iterator,
93 nth_index_const_iterator<employee_set,0>::type >::value));
94 BOOST_STATIC_ASSERT((boost::is_same<
95 employee_set_by_name::const_iterator,
96 nth_index_const_iterator<employee_set,1>::type >::value));
97#if defined(BOOST_NO_MEMBER_TEMPLATES)
98 BOOST_STATIC_ASSERT((boost::is_same<
99 employee_set_by_age::const_iterator,
100 index_const_iterator<employee_set,age>::type >::value));
101#else
102 BOOST_STATIC_ASSERT((boost::is_same<
103 employee_set_by_age::const_iterator,
104 employee_set::index_const_iterator<age>::type >::value));
105#endif
106 BOOST_STATIC_ASSERT((boost::is_same<
107 employee_set_as_inserted::const_iterator,
108 nth_index_const_iterator<employee_set,3>::type >::value));
109 BOOST_STATIC_ASSERT((boost::is_same<
110 employee_set_by_ssn::const_iterator,
111 nth_index_const_iterator<employee_set,4>::type >::value));
112 BOOST_STATIC_ASSERT((boost::is_same<
113 employee_set_randomly::const_iterator,
114 nth_index_const_iterator<employee_set,5>::type >::value));
115
116 cit= ces.find(x: employee(4,"John",57,1002));
117#if defined(BOOST_NO_MEMBER_TEMPLATES)
118 cit1= project<by_name>(ces,cit);
119#else
120 cit1= ces.project<by_name>(it: cit);
121#endif
122 cit2= project<age>(m: ces,it: cit1);
123#if defined(BOOST_NO_MEMBER_TEMPLATES)
124 cit3= project<as_inserted>(ces,cit2);
125#else
126 cit3= ces.project<as_inserted>(it: cit2);
127#endif
128 cit4= project<ssn>(m: ces,it: cit3);
129 cit5= project<randomly>(m: ces,it: cit4);
130 citbis=project<0>(m: ces,it: cit5);
131
132 BOOST_TEST(
133 *cit==*cit1&&*cit1==*cit2&&*cit2==*cit3&&*cit3==*cit4&&*cit4==*cit5&&
134 citbis==cit);
135}
136

source code of boost/libs/multi_index/test/test_projection.cpp