]>
Commit | Line | Data |
---|---|---|
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 | ||
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 | |
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 | ||
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> |