Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/libs/multi_index/example/basic.cpp @ 33

Last change on this file since 33 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

File size: 3.0 KB
Line 
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
24using boost::multi_index_container;
25using namespace boost::multi_index;
26
27/* an employee record holds its ID, name and age */
28
29struct 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
46struct id{};
47struct name{};
48struct 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
60typedef 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
71template<typename Tag,typename MultiIndexContainer>
72void 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
90int 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}
Note: See TracBrowser for help on using the repository browser.