1//////////////////////////////////////////////////////////////////////////////
2//
3// (C) Copyright Ion Gaztanaga 2004-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
11#ifndef BOOST_INTERPROCESS_TEST_VECTOR_TEST_HEADER
12#define BOOST_INTERPROCESS_TEST_VECTOR_TEST_HEADER
13
14#include <boost/interprocess/detail/config_begin.hpp>
15
16#include <boost/interprocess/exceptions.hpp>
17#include <boost/move/utility_core.hpp>
18#include <boost/interprocess/detail/mpl.hpp>
19#include "print_container.hpp"
20#include "check_equal_containers.hpp"
21#include "movable_int.hpp"
22
23#include "get_process_id_name.hpp"
24#include "emplace_test.hpp"
25
26#include <vector>
27#include <list>
28#include <string>
29#include <iostream>
30#include <cstddef>
31
32
33namespace boost{
34namespace interprocess{
35namespace test{
36
37template<class V1, class V2>
38bool copyable_only(V1 *, V2 *, boost::interprocess::ipcdetail::false_type)
39{
40 return true;
41}
42
43//Function to check if both sets are equal
44template<class V1, class V2>
45bool copyable_only(V1 *shmvector, V2 *stdvector, boost::interprocess::ipcdetail::true_type)
46{
47 typedef typename V1::value_type IntType;
48 std::size_t size = shmvector->size();
49 stdvector->insert(stdvector->end(), 50u, 1);
50 shmvector->insert(shmvector->end(), 50u, IntType(1));
51 if(!test::CheckEqualContainers(shmvector, stdvector)) return false;
52
53 {
54 IntType move_me(1);
55 stdvector->insert(stdvector->begin()+std::ptrdiff_t(size/2u), 50u, 1);
56 shmvector->insert(shmvector->begin()+std::ptrdiff_t(size/2u), 50u, boost::move(move_me));
57 if(!test::CheckEqualContainers(shmvector, stdvector)) return false;
58 }
59 {
60 IntType move_me(2);
61 shmvector->assign(shmvector->size()/2, boost::move(move_me));
62 stdvector->assign(stdvector->size()/2, 2);
63 if(!test::CheckEqualContainers(shmvector, stdvector)) return false;
64 }
65 {
66 IntType move_me(3);
67 shmvector->assign(shmvector->size()*3-1, boost::move(move_me));
68 stdvector->assign(stdvector->size()*3-1, 3);
69 if(!test::CheckEqualContainers(shmvector, stdvector)) return false;
70 }
71 return true;
72}
73
74template<class ManagedSharedMemory
75 ,class MyShmVector>
76int vector_test()
77{
78 typedef std::vector<int> MyStdVector;
79 typedef typename MyShmVector::value_type IntType;
80
81 std::string process_name;
82 test::get_process_id_name(str&: process_name);
83
84 const int Memsize = 128u*1024u;
85 const char *const shMemName = process_name.c_str();
86 const int max = 100;
87
88 {
89 //Compare several shared memory vector operations with std::vector
90 //Create shared memory
91 shared_memory_object::remove(filename: shMemName);
92 BOOST_TRY{
93 ManagedSharedMemory segment(create_only, shMemName, Memsize);
94
95 segment.reserve_named_objects(10);
96
97 //Shared memory allocator must be always be initialized
98 //since it has no default constructor
99 MyShmVector *shmvector = segment.template construct<MyShmVector>("MyShmVector")
100 (segment.get_segment_manager());
101 MyStdVector *stdvector = new MyStdVector;
102
103 shmvector->resize(100);
104 stdvector->resize(new_size: 100);
105 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
106
107 shmvector->resize(200);
108 stdvector->resize(new_size: 200);
109 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
110
111 shmvector->resize(0);
112 stdvector->resize(new_size: 0);
113 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
114
115 for(int i = 0; i < max; ++i){
116 IntType new_int(i);
117 shmvector->insert(shmvector->end(), boost::move(new_int));
118 stdvector->insert(position: stdvector->end(), x: i);
119 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
120 }
121 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
122
123 typename MyShmVector::iterator shmit(shmvector->begin());
124 typename MyStdVector::iterator stdit(stdvector->begin());
125 typename MyShmVector::const_iterator cshmit = shmit;
126 (void)cshmit;
127 ++shmit; ++stdit;
128 shmvector->erase(shmit);
129 stdvector->erase(position: stdit);
130 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
131
132 shmvector->erase(shmvector->begin());
133 stdvector->erase(position: stdvector->begin());
134 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
135
136 {
137 //Initialize values
138 IntType aux_vect[50];
139 for(int i = 0; i < 50; ++i){
140 IntType new_int(-1);
141 aux_vect[i] = boost::move(new_int);
142 }
143 int aux_vect2[50];
144 for(int i = 0; i < 50; ++i){
145 aux_vect2[i] = -1;
146 }
147
148 shmvector->insert(shmvector->end()
149 ,::boost::make_move_iterator(&aux_vect[0])
150 ,::boost::make_move_iterator(aux_vect + 50));
151 stdvector->insert(position: stdvector->end(), first: aux_vect2, last: aux_vect2 + 50);
152 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
153
154 for(int i = 0, j = static_cast<int>(shmvector->size()); i < j; ++i){
155 shmvector->erase(shmvector->begin());
156 stdvector->erase(position: stdvector->begin());
157 }
158 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
159 }
160 {
161 IntType aux_vect[50];
162 for(int i = 0; i < 50; ++i){
163 IntType new_int(-1);
164 aux_vect[i] = boost::move(new_int);
165 }
166 int aux_vect2[50];
167 for(int i = 0; i < 50; ++i){
168 aux_vect2[i] = -1;
169 }
170 shmvector->insert(shmvector->begin()
171 ,::boost::make_move_iterator(&aux_vect[0])
172 ,::boost::make_move_iterator(aux_vect + 50));
173 stdvector->insert(position: stdvector->begin(), first: aux_vect2, last: aux_vect2 + 50);
174 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
175 }
176
177 shmvector->reserve(shmvector->size()*2);
178 stdvector->reserve(n: stdvector->size()*2);
179 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
180
181 IntType push_back_this(1);
182 shmvector->push_back(boost::move(push_back_this));
183 stdvector->push_back(x: int(1));
184 shmvector->push_back(IntType(1));
185 stdvector->push_back(x: int(1));
186 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
187
188 if(!copyable_only(shmvector, stdvector
189 ,ipcdetail::bool_<!ipcdetail::is_same<IntType, test::movable_int>::value>())){
190 return 1;
191 }
192
193 shmvector->erase(shmvector->begin());
194 stdvector->erase(position: stdvector->begin());
195 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
196
197 for(int i = 0; i < max; ++i){
198 IntType insert_this(i);
199 shmvector->insert(shmvector->begin(), boost::move(insert_this));
200 stdvector->insert(position: stdvector->begin(), x: i);
201 shmvector->insert(shmvector->begin(), IntType(i));
202 stdvector->insert(position: stdvector->begin(), x: int(i));
203 }
204 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
205
206 //Test insertion from list
207 {
208 std::list<int> l(50, int(1));
209 shmvector->insert(shmvector->begin(), l.begin(), l.end());
210 stdvector->insert(position: stdvector->begin(), first: l.begin(), last: l.end());
211 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
212 shmvector->assign(l.begin(), l.end());
213 stdvector->assign(first: l.begin(), last: l.end());
214 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
215 }
216/*
217 std::size_t cap = shmvector->capacity();
218 shmvector->reserve(cap*2);
219 stdvector->reserve(cap*2);
220 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
221 shmvector->resize(0);
222 stdvector->resize(0);
223 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
224 shmvector->resize(cap*2);
225 stdvector->resize(cap*2);
226 if(!test::CheckEqualContainers(shmvector, stdvector)) return 1;
227*/
228
229 delete stdvector;
230 segment.template destroy<MyShmVector>("MyShmVector");
231 segment.shrink_to_fit_indexes();
232
233 if(!segment.all_memory_deallocated())
234 return 1;
235 }
236 BOOST_CATCH(std::exception &ex){
237 shared_memory_object::remove(filename: shMemName);
238 std::cout << ex.what() << std::endl;
239 return 1;
240 } BOOST_CATCH_END
241 }
242 shared_memory_object::remove(filename: shMemName);
243 std::cout << std::endl << "Test OK!" << std::endl;
244 return 0;
245}
246
247} //namespace test{
248} //namespace interprocess{
249} //namespace boost{
250
251#include <boost/interprocess/detail/config_end.hpp>
252
253#endif
254

source code of boost/libs/interprocess/test/vector_test.hpp