• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Used in Boost.MultiIndex tests.
2  *
3  * Copyright 2003-2018 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 #ifndef BOOST_MULTI_INDEX_TEST_EMPLOYEE_HPP
12 #define BOOST_MULTI_INDEX_TEST_EMPLOYEE_HPP
13 
14 #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
15 #include <boost/move/core.hpp>
16 #include <boost/move/utility_core.hpp>
17 #include <boost/mpl/vector.hpp>
18 #include <boost/multi_index_container.hpp>
19 #include <boost/multi_index/hashed_index.hpp>
20 #include <boost/multi_index/identity.hpp>
21 #include <boost/multi_index/member.hpp>
22 #include <boost/multi_index/ordered_index.hpp>
23 #include <boost/multi_index/random_access_index.hpp>
24 #include <boost/multi_index/ranked_index.hpp>
25 #include <boost/multi_index/sequenced_index.hpp>
26 #include <ostream>
27 #include <string>
28 #include "non_std_allocator.hpp"
29 
30 struct employee
31 {
32   int         id;
33   std::string name;
34   int         age;
35   int         ssn;
36 
employeeemployee37   employee(int id_,std::string name_,int age_,int ssn_):
38     id(id_),name(name_),age(age_),ssn(ssn_)
39   {}
40 
employeeemployee41   employee(const employee& x):
42     id(x.id),name(x.name),age(x.age),ssn(x.ssn)
43   {}
44 
employeeemployee45   employee(BOOST_RV_REF(employee) x):
46     id(x.id),name(boost::move(x.name)),age(x.age),ssn(x.ssn)
47   {}
48 
operator =employee49   employee& operator=(BOOST_COPY_ASSIGN_REF(employee) x)
50   {
51     id=x.id;
52     name=x.name;
53     age=x.age;
54     ssn=x.ssn;
55     return *this;
56   };
57 
operator =employee58   employee& operator=(BOOST_RV_REF(employee) x)
59   {
60     id=x.id;
61     name=boost::move(x.name);
62     age=x.age;
63     ssn=x.ssn;
64     return *this;
65   }
66 
operator ==employee67   bool operator==(const employee& x)const
68   {
69     return id==x.id&&name==x.name&&age==x.age;
70   }
71 
operator <employee72   bool operator<(const employee& x)const
73   {
74     return id<x.id;
75   }
76 
operator !=employee77   bool operator!=(const employee& x)const{return !(*this==x);}
operator >employee78   bool operator> (const employee& x)const{return x<*this;}
operator >=employee79   bool operator>=(const employee& x)const{return !(*this<x);}
operator <=employee80   bool operator<=(const employee& x)const{return !(x<*this);}
81 
82   struct comp_id
83   {
operator ()employee::comp_id84     bool operator()(int x,const employee& e2)const{return x<e2.id;}
operator ()employee::comp_id85     bool operator()(const employee& e1,int x)const{return e1.id<x;}
86   };
87 
operator <<(std::ostream & os,const employee & e)88   friend std::ostream& operator<<(std::ostream& os,const employee& e)
89   {
90     os<<e.id<<" "<<e.name<<" "<<e.age<<std::endl;
91     return os;
92   }
93 
94 private:
95   BOOST_COPYABLE_AND_MOVABLE(employee)
96 };
97 
98 struct name{};
99 struct by_name{};
100 struct age{};
101 struct as_inserted{};
102 struct ssn{};
103 struct randomly{};
104 
105 struct employee_set_indices:
106   boost::mpl::vector<
107     boost::multi_index::ordered_unique<
108       boost::multi_index::identity<employee> >,
109     boost::multi_index::hashed_non_unique<
110       boost::multi_index::tag<name,by_name>,
111       BOOST_MULTI_INDEX_MEMBER(employee,std::string,name)>,
112     boost::multi_index::ranked_non_unique<
113       boost::multi_index::tag<age>,
114       BOOST_MULTI_INDEX_MEMBER(employee,int,age)>,
115     boost::multi_index::sequenced<
116       boost::multi_index::tag<as_inserted> >,
117     boost::multi_index::hashed_unique<
118       boost::multi_index::tag<ssn>,
119       BOOST_MULTI_INDEX_MEMBER(employee,int,ssn)>,
120     boost::multi_index::random_access<
121       boost::multi_index::tag<randomly> > >
122 {};
123 
124 typedef
125   boost::multi_index::multi_index_container<
126     employee,
127     employee_set_indices,
128     non_std_allocator<employee> >        employee_set;
129 
130 #if defined(BOOST_NO_MEMBER_TEMPLATES)
131 typedef boost::multi_index::nth_index<
132   employee_set,1>::type                  employee_set_by_name;
133 #else
134 typedef employee_set::nth_index<1>::type employee_set_by_name;
135 #endif
136 
137 typedef boost::multi_index::index<
138          employee_set,age>::type         employee_set_by_age;
139 typedef boost::multi_index::index<
140          employee_set,as_inserted>::type employee_set_as_inserted;
141 typedef boost::multi_index::index<
142          employee_set,ssn>::type         employee_set_by_ssn;
143 
144 #if defined(BOOST_NO_MEMBER_TEMPLATES)
145 typedef boost::multi_index::index<
146          employee_set,randomly>::type    employee_set_randomly;
147 #else
148 typedef employee_set::index<
149           randomly>::type                employee_set_randomly;
150 #endif
151 
152 #endif
153