]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/interprocess/example/doc_multi_index.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / 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>