]> git.proxmox.com Git - ceph.git/blame - 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
CommitLineData
7c673cae
FG
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
31using namespace boost::interprocess;
32namespace bmi = boost::multi_index;
33
34typedef managed_shared_memory::allocator<char>::type char_allocator;
35typedef basic_string<char, std::char_traits<char>, char_allocator>shm_string;
36
37//Data to insert in shared memory
38struct 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
52struct id{};
53struct age{};
54struct 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.
60typedef bmi::multi_index_container<
61 employee,
62 bmi::indexed_by<
63 bmi::ordered_unique
b32b8144 64 <bmi::tag<id>, bmi::member<employee,int,&employee::id> >,
7c673cae 65 bmi::ordered_non_unique<
b32b8144 66 bmi::tag<name>, bmi::member<employee,shm_string,&employee::name> >,
7c673cae 67 bmi::ordered_non_unique
b32b8144 68 <bmi::tag<age>, bmi::member<employee,int,&employee::age> > >,
7c673cae
FG
69 managed_shared_memory::allocator<employee>::type
70> employee_set;
71
72int 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>