| 1 | /* Boost.MultiIndex basic example. | 
|---|
| 2 |  * | 
|---|
| 3 |  * Copyright 2003-2005 Joaquín M López Muñoz. | 
|---|
| 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 | #if !defined(NDEBUG) | 
|---|
| 12 | #define BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING | 
|---|
| 13 | #define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE | 
|---|
| 14 | #endif | 
|---|
| 15 |  | 
|---|
| 16 | #include <boost/multi_index_container.hpp> | 
|---|
| 17 | #include <boost/multi_index/member.hpp> | 
|---|
| 18 | #include <boost/multi_index/ordered_index.hpp> | 
|---|
| 19 | #include <algorithm> | 
|---|
| 20 | #include <iostream> | 
|---|
| 21 | #include <iterator> | 
|---|
| 22 | #include <string> | 
|---|
| 23 |  | 
|---|
| 24 | using boost::multi_index_container; | 
|---|
| 25 | using namespace boost::multi_index; | 
|---|
| 26 |  | 
|---|
| 27 | /* an employee record holds its ID, name and age */ | 
|---|
| 28 |  | 
|---|
| 29 | struct employee | 
|---|
| 30 | { | 
|---|
| 31 |   int         id; | 
|---|
| 32 |   std::string name; | 
|---|
| 33 |   int         age; | 
|---|
| 34 |  | 
|---|
| 35 |   employee(int id_,std::string name_,int age_):id(id_),name(name_),age(age_){} | 
|---|
| 36 |  | 
|---|
| 37 |   friend std::ostream& operator<<(std::ostream& os,const employee& e) | 
|---|
| 38 |   { | 
|---|
| 39 |     os<<e.id<<" "<<e.name<<" "<<e.age<<std::endl; | 
|---|
| 40 |     return os; | 
|---|
| 41 |   } | 
|---|
| 42 | }; | 
|---|
| 43 |  | 
|---|
| 44 | /* tags for accessing the corresponding indices of employee_set */ | 
|---|
| 45 |  | 
|---|
| 46 | struct id{}; | 
|---|
| 47 | struct name{}; | 
|---|
| 48 | struct age{}; | 
|---|
| 49 |  | 
|---|
| 50 | /* see Compiler specifics: Use of member_offset for info on | 
|---|
| 51 |  * BOOST_MULTI_INDEX_MEMBER | 
|---|
| 52 |  */ | 
|---|
| 53 |  | 
|---|
| 54 | /* Define a multi_index_container of employees with following indices: | 
|---|
| 55 |  *   - a unique index sorted by employee::int, | 
|---|
| 56 |  *   - a non-unique index sorted by employee::name, | 
|---|
| 57 |  *   - a non-unique index sorted by employee::age. | 
|---|
| 58 |  */ | 
|---|
| 59 |  | 
|---|
| 60 | typedef multi_index_container< | 
|---|
| 61 |   employee, | 
|---|
| 62 |   indexed_by< | 
|---|
| 63 |     ordered_unique< | 
|---|
| 64 |       tag<id>,  BOOST_MULTI_INDEX_MEMBER(employee,int,id)>, | 
|---|
| 65 |     ordered_non_unique< | 
|---|
| 66 |       tag<name>,BOOST_MULTI_INDEX_MEMBER(employee,std::string,name)>, | 
|---|
| 67 |     ordered_non_unique< | 
|---|
| 68 |       tag<age>, BOOST_MULTI_INDEX_MEMBER(employee,int,age)> > | 
|---|
| 69 | > employee_set; | 
|---|
| 70 |  | 
|---|
| 71 | template<typename Tag,typename MultiIndexContainer> | 
|---|
| 72 | void print_out_by( | 
|---|
| 73 |  const MultiIndexContainer& s, | 
|---|
| 74 |  Tag* =0 /* fixes a MSVC++ 6.0 bug with implicit template function parms */ | 
|---|
| 75 | ) | 
|---|
| 76 | { | 
|---|
| 77 |   /* obtain a reference to the index tagged by Tag */ | 
|---|
| 78 |  | 
|---|
| 79 |   const typename boost::multi_index::index<MultiIndexContainer,Tag>::type& i= | 
|---|
| 80 |     get<Tag>(s); | 
|---|
| 81 |  | 
|---|
| 82 |   typedef typename MultiIndexContainer::value_type value_type; | 
|---|
| 83 |  | 
|---|
| 84 |   /* dump the elements of the index to cout */ | 
|---|
| 85 |  | 
|---|
| 86 |   std::copy(i.begin(),i.end(),std::ostream_iterator<value_type>(std::cout)); | 
|---|
| 87 | } | 
|---|
| 88 |  | 
|---|
| 89 |  | 
|---|
| 90 | int main() | 
|---|
| 91 | { | 
|---|
| 92 |   employee_set es; | 
|---|
| 93 |  | 
|---|
| 94 |   es.insert(employee(0,"Joe",31)); | 
|---|
| 95 |   es.insert(employee(1,"Robert",27)); | 
|---|
| 96 |   es.insert(employee(2,"John",40)); | 
|---|
| 97 |  | 
|---|
| 98 |   /* next insertion will fail, as there is an employee with | 
|---|
| 99 |    * the same ID | 
|---|
| 100 |    */ | 
|---|
| 101 |  | 
|---|
| 102 |   es.insert(employee(2,"Aristotle",2387)); | 
|---|
| 103 |  | 
|---|
| 104 |   es.insert(employee(3,"Albert",20)); | 
|---|
| 105 |   es.insert(employee(4,"John",57)); | 
|---|
| 106 |  | 
|---|
| 107 |   /* list the employees sorted by ID, name and age */ | 
|---|
| 108 |  | 
|---|
| 109 |   std::cout<<"by ID"<<std::endl; | 
|---|
| 110 |   print_out_by<id>(es); | 
|---|
| 111 |   std::cout<<std::endl; | 
|---|
| 112 |  | 
|---|
| 113 |   std::cout<<"by name"<<std::endl; | 
|---|
| 114 |   print_out_by<name>(es); | 
|---|
| 115 |   std::cout<<std::endl; | 
|---|
| 116 |  | 
|---|
| 117 |   std::cout<<"by age"<<std::endl; | 
|---|
| 118 |   print_out_by<age>(es); | 
|---|
| 119 |   std::cout<<std::endl; | 
|---|
| 120 |  | 
|---|
| 121 |   return 0; | 
|---|
| 122 | } | 
|---|