Imported Upstream version 1.64.0
[platform/upstream/boost.git] / libs / interprocess / example / doc_multi_index.cpp
1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga 2006-2012. Distributed under the Boost
4 // Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // See http://www.boost.org/libs/interprocess for documentation.
8 //
9 //////////////////////////////////////////////////////////////////////////////
10 #include <boost/interprocess/detail/config_begin.hpp>
11 #include <boost/interprocess/detail/workaround.hpp>
12 //[doc_multi_index
13 #include <boost/interprocess/managed_shared_memory.hpp>
14 #include <boost/interprocess/allocators/allocator.hpp>
15 #include <boost/interprocess/containers/string.hpp>
16
17 //<-
18 //Shield against external warnings
19 #include <boost/interprocess/detail/config_external_begin.hpp>
20 //->
21
22 #include <boost/multi_index_container.hpp>
23 #include <boost/multi_index/member.hpp>
24 #include <boost/multi_index/ordered_index.hpp>
25
26 //<-
27 #include <boost/interprocess/detail/config_external_end.hpp>
28 #include "../test/get_process_id_name.hpp"
29 //->
30
31 using namespace boost::interprocess;
32 namespace bmi = boost::multi_index;
33
34 typedef managed_shared_memory::allocator<char>::type              char_allocator;
35 typedef basic_string<char, std::char_traits<char>, char_allocator>shm_string;
36
37 //Data to insert in shared memory
38 struct employee
39 {
40    int         id;
41    int         age;
42    shm_string  name;
43    employee( int id_
44            , int age_
45            , const char *name_
46            , const char_allocator &a)
47       : id(id_), age(age_), name(name_, a)
48    {}
49 };
50
51 //Tags
52 struct id{};
53 struct age{};
54 struct name{};
55
56 // Define a multi_index_container of employees with following indices:
57 //   - a unique index sorted by employee::int,
58 //   - a non-unique index sorted by employee::name,
59 //   - a non-unique index sorted by employee::age.
60 typedef bmi::multi_index_container<
61   employee,
62   bmi::indexed_by<
63     bmi::ordered_unique
64       <bmi::tag<id>,  bmi::member<employee,int,&employee::id> >,
65     bmi::ordered_non_unique<
66       bmi::tag<name>, bmi::member<employee,shm_string,&employee::name> >,
67     bmi::ordered_non_unique
68       <bmi::tag<age>, bmi::member<employee,int,&employee::age> > >,
69   managed_shared_memory::allocator<employee>::type
70 > employee_set;
71
72 int main ()
73 {
74    //Remove shared memory on construction and destruction
75    struct shm_remove
76    {
77    //<-
78    #if 1
79       shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
80       ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
81    #else
82    //->
83       shm_remove() { shared_memory_object::remove("MySharedMemory"); }
84       ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
85    //<-
86    #endif
87    //->
88    } remover;
89    //<-
90    (void)remover;
91    //->
92
93    //Create shared memory
94    //<-
95    #if 1
96    managed_shared_memory segment(create_only,test::get_process_id_name(), 65536);
97    #else
98    //->
99    managed_shared_memory segment(create_only,"MySharedMemory", 65536);
100    //<-
101    #endif
102    //->
103
104    //Construct the multi_index in shared memory
105    employee_set *es = segment.construct<employee_set>
106       ("My MultiIndex Container")            //Container's name in shared memory
107       ( employee_set::ctor_args_list()
108       , segment.get_allocator<employee>());  //Ctor parameters
109
110    //Now insert elements
111    char_allocator ca(segment.get_allocator<char>());
112    es->insert(employee(0,31, "Joe", ca));
113    es->insert(employee(1,27, "Robert", ca));
114    es->insert(employee(2,40, "John", ca));
115    return 0;
116 }
117 //]
118 #include <boost/interprocess/detail/config_end.hpp>