set_test.hpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  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. #ifndef BOOST_INTERPROCESS_TEST_SET_TEST_HEADER
  11. #define BOOST_INTERPROCESS_TEST_SET_TEST_HEADER
  12. #include <boost/interprocess/detail/config_begin.hpp>
  13. #include "check_equal_containers.hpp"
  14. #include "print_container.hpp"
  15. #include <boost/move/utility_core.hpp>
  16. #include "get_process_id_name.hpp"
  17. #include <functional>
  18. namespace boost{
  19. namespace interprocess{
  20. namespace test{
  21. template<class ManagedSharedMemory
  22. ,class MyShmSet
  23. ,class MyStdSet
  24. ,class MyShmMultiSet
  25. ,class MyStdMultiSet>
  26. int set_test ()
  27. {
  28. typedef typename MyShmSet::value_type IntType;
  29. const int memsize = 65536;
  30. const char *const shMemName = test::get_process_id_name();
  31. const int max = 100;
  32. try{
  33. //Create shared memory
  34. shared_memory_object::remove(shMemName);
  35. ManagedSharedMemory segment(create_only, shMemName, memsize);
  36. segment.reserve_named_objects(100);
  37. //Shared memory allocator must be always be initialized
  38. //since it has no default constructor
  39. MyShmSet *shmset =
  40. segment.template construct<MyShmSet>("MyShmSet")
  41. (std::less<IntType>(), segment.get_segment_manager());
  42. MyStdSet *stdset = new MyStdSet;
  43. MyShmMultiSet *shmmultiset =
  44. segment.template construct<MyShmMultiSet>("MyShmMultiSet")
  45. (std::less<IntType>(), segment.get_segment_manager());
  46. MyStdMultiSet *stdmultiset = new MyStdMultiSet;
  47. //Test construction from a range
  48. {
  49. IntType aux_vect[50];
  50. for(int i = 0; i < 50; ++i){
  51. IntType move_me(i/2);
  52. aux_vect[i] = boost::move(move_me);
  53. }
  54. int aux_vect2[50];
  55. for(int i = 0; i < 50; ++i){
  56. aux_vect2[i] = i/2;
  57. }
  58. IntType aux_vect3[50];
  59. for(int i = 0; i < 50; ++i){
  60. IntType move_me(i/2);
  61. aux_vect3[i] = boost::move(move_me);
  62. }
  63. MyShmSet *shmset2 =
  64. segment.template construct<MyShmSet>("MyShmSet2")
  65. ( ::boost::make_move_iterator(&aux_vect[0])
  66. , ::boost::make_move_iterator(aux_vect + 50)
  67. , std::less<IntType>(), segment.get_segment_manager());
  68. MyStdSet *stdset2 = new MyStdSet(aux_vect2, aux_vect2 + 50);
  69. MyShmMultiSet *shmmultiset2 =
  70. segment.template construct<MyShmMultiSet>("MyShmMultiSet2")
  71. ( ::boost::make_move_iterator(&aux_vect3[0])
  72. , ::boost::make_move_iterator(aux_vect3 + 50)
  73. , std::less<IntType>(), segment.get_segment_manager());
  74. MyStdMultiSet *stdmultiset2 = new MyStdMultiSet(aux_vect2, aux_vect2 + 50);
  75. if(!CheckEqualContainers(shmset2, stdset2)){
  76. std::cout << "Error in construct<MyShmSet>(MyShmSet2)" << std::endl;
  77. return 1;
  78. }
  79. if(!CheckEqualContainers(shmmultiset2, stdmultiset2)){
  80. std::cout << "Error in construct<MyShmMultiSet>(MyShmMultiSet2)" << std::endl;
  81. return 1;
  82. }
  83. //ordered range insertion
  84. for(int i = 0; i < 50; ++i){
  85. IntType move_me(i);
  86. aux_vect[i] = boost::move(move_me);
  87. }
  88. for(int i = 0; i < 50; ++i){
  89. aux_vect2[i] = i;
  90. }
  91. for(int i = 0; i < 50; ++i){
  92. IntType move_me(i);
  93. aux_vect3[i] = boost::move(move_me);
  94. }
  95. MyShmSet *shmset3 =
  96. segment.template construct<MyShmSet>("MyShmSet3")
  97. ( ordered_unique_range
  98. , ::boost::make_move_iterator(&aux_vect[0])
  99. , ::boost::make_move_iterator(aux_vect + 50)
  100. , std::less<IntType>(), segment.get_segment_manager());
  101. MyStdSet *stdset3 = new MyStdSet(aux_vect2, aux_vect2 + 50);
  102. MyShmMultiSet *shmmultiset3 =
  103. segment.template construct<MyShmMultiSet>("MyShmMultiSet3")
  104. ( ordered_range
  105. , ::boost::make_move_iterator(&aux_vect3[0])
  106. , ::boost::make_move_iterator(aux_vect3 + 50)
  107. , std::less<IntType>(), segment.get_segment_manager());
  108. MyStdMultiSet *stdmultiset3 = new MyStdMultiSet(aux_vect2, aux_vect2 + 50);
  109. if(!CheckEqualContainers(shmset3, stdset3)){
  110. std::cout << "Error in construct<MyShmSet>(MyShmSet3)" << std::endl;
  111. return 1;
  112. }
  113. if(!CheckEqualContainers(shmmultiset3, stdmultiset3)){
  114. std::cout << "Error in construct<MyShmMultiSet>(MyShmMultiSet3)" << std::endl;
  115. return 1;
  116. }
  117. segment.destroy_ptr(shmset2);
  118. segment.destroy_ptr(shmmultiset2);
  119. delete stdset2;
  120. delete stdmultiset2;
  121. segment.destroy_ptr(shmset3);
  122. segment.destroy_ptr(shmmultiset3);
  123. delete stdset3;
  124. delete stdmultiset3;
  125. }
  126. if(!CheckEqualContainers(shmset, stdset)){
  127. std::cout << "Error in shmset->insert(boost::move(move_me)" << std::endl;
  128. return 1;
  129. }
  130. for(int i = 0; i < max/2; ++i){
  131. IntType move_me(i);
  132. shmset->insert(boost::move(move_me));
  133. stdset->insert(i);
  134. IntType move_me2(i);
  135. shmmultiset->insert(boost::move(move_me2));
  136. stdmultiset->insert(i);
  137. if(!CheckEqualContainers(shmset, stdset)){
  138. std::cout << "Error in shmset->insert(boost::move(move_me)" << std::endl;
  139. return 1;
  140. }
  141. //
  142. shmset->insert(IntType(i));
  143. stdset->insert(i);
  144. shmmultiset->insert(IntType(i));
  145. stdmultiset->insert(i);
  146. if(!CheckEqualContainers(shmset, stdset)){
  147. std::cout << "Error in shmset->insert(boost::move(move_me)" << std::endl;
  148. return 1;
  149. }
  150. }
  151. if(!CheckEqualContainers(shmset, stdset)){
  152. std::cout << "Error in shmset->insert(boost::move(move_me)" << std::endl;
  153. return 1;
  154. }
  155. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  156. std::cout << "Error in shmmultiset->insert(boost::move(move_me)" << std::endl;
  157. return 1;
  158. }
  159. typename MyShmSet::iterator it;
  160. typename MyShmSet::const_iterator cit = it;
  161. (void)cit;
  162. shmset->erase(shmset->begin()++);
  163. stdset->erase(stdset->begin()++);
  164. shmmultiset->erase(shmmultiset->begin()++);
  165. stdmultiset->erase(stdmultiset->begin()++);
  166. if(!CheckEqualContainers(shmset, stdset)){
  167. std::cout << "Error in shmset->erase(shmset->begin()++)" << std::endl;
  168. return 1;
  169. }
  170. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  171. std::cout << "Error in shmmultiset->erase(shmmultiset->begin()++)" << std::endl;
  172. return 1;
  173. }
  174. shmset->erase(shmset->begin());
  175. stdset->erase(stdset->begin());
  176. shmmultiset->erase(shmmultiset->begin());
  177. stdmultiset->erase(stdmultiset->begin());
  178. if(!CheckEqualContainers(shmset, stdset)){
  179. std::cout << "Error in shmset->erase(shmset->begin())" << std::endl;
  180. return 1;
  181. }
  182. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  183. std::cout << "Error in shmmultiset->erase(shmmultiset->begin())" << std::endl;
  184. return 1;
  185. }
  186. //Swapping test
  187. std::less<IntType> lessfunc;
  188. MyShmSet tmpshmeset2 (lessfunc, segment.get_segment_manager());
  189. MyStdSet tmpstdset2;
  190. MyShmMultiSet tmpshmemultiset2(lessfunc, segment.get_segment_manager());
  191. MyStdMultiSet tmpstdmultiset2;
  192. shmset->swap(tmpshmeset2);
  193. stdset->swap(tmpstdset2);
  194. shmmultiset->swap(tmpshmemultiset2);
  195. stdmultiset->swap(tmpstdmultiset2);
  196. shmset->swap(tmpshmeset2);
  197. stdset->swap(tmpstdset2);
  198. shmmultiset->swap(tmpshmemultiset2);
  199. stdmultiset->swap(tmpstdmultiset2);
  200. if(!CheckEqualContainers(shmset, stdset)){
  201. std::cout << "Error in shmset->swap(tmpshmeset2)" << std::endl;
  202. return 1;
  203. }
  204. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  205. std::cout << "Error in shmmultiset->swap(tmpshmemultiset2)" << std::endl;
  206. return 1;
  207. }
  208. //Insertion from other container
  209. //Initialize values
  210. {
  211. IntType aux_vect[50];
  212. for(int i = 0; i < 50; ++i){
  213. IntType move_me(-1);
  214. aux_vect[i] = boost::move(move_me);
  215. }
  216. int aux_vect2[50];
  217. for(int i = 0; i < 50; ++i){
  218. aux_vect2[i] = -1;
  219. }
  220. IntType aux_vect3[50];
  221. for(int i = 0; i < 50; ++i){
  222. IntType move_me(-1);
  223. aux_vect3[i] = boost::move(move_me);
  224. }
  225. shmset->insert(::boost::make_move_iterator(&aux_vect[0]), ::boost::make_move_iterator(aux_vect + 50));
  226. stdset->insert(aux_vect2, aux_vect2 + 50);
  227. shmmultiset->insert(::boost::make_move_iterator(&aux_vect3[0]), ::boost::make_move_iterator(aux_vect3 + 50));
  228. stdmultiset->insert(aux_vect2, aux_vect2 + 50);
  229. if(!CheckEqualContainers(shmset, stdset)){
  230. std::cout << "Error in shmset->insert(::boost::make_move_iterator(&aux_vect[0])..." << std::endl;
  231. return 1;
  232. }
  233. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  234. std::cout << "Error in shmmultiset->insert(::boost::make_move_iterator(&aux_vect3[0]), ..." << std::endl;
  235. return 1;
  236. }
  237. for(int i = 0, j = static_cast<int>(shmset->size()); i < j; ++i){
  238. IntType erase_me(i);
  239. shmset->erase(erase_me);
  240. stdset->erase(i);
  241. shmmultiset->erase(erase_me);
  242. stdmultiset->erase(i);
  243. if(!CheckEqualContainers(shmset, stdset)){
  244. std::cout << "Error in shmset->erase(erase_me)" << shmset->size() << " " << stdset->size() << std::endl;
  245. return 1;
  246. }
  247. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  248. std::cout << "Error in shmmultiset->erase(erase_me)" << std::endl;
  249. return 1;
  250. }
  251. }
  252. }
  253. {
  254. IntType aux_vect[50];
  255. for(int i = 0; i < 50; ++i){
  256. IntType move_me(-1);
  257. aux_vect[i] = boost::move(move_me);
  258. }
  259. int aux_vect2[50];
  260. for(int i = 0; i < 50; ++i){
  261. aux_vect2[i] = -1;
  262. }
  263. IntType aux_vect3[50];
  264. for(int i = 0; i < 50; ++i){
  265. IntType move_me(-1);
  266. aux_vect3[i] = boost::move(move_me);
  267. }
  268. IntType aux_vect4[50];
  269. for(int i = 0; i < 50; ++i){
  270. IntType move_me(-1);
  271. aux_vect4[i] = boost::move(move_me);
  272. }
  273. IntType aux_vect5[50];
  274. for(int i = 0; i < 50; ++i){
  275. IntType move_me(-1);
  276. aux_vect5[i] = boost::move(move_me);
  277. }
  278. shmset->insert(::boost::make_move_iterator(&aux_vect[0]), ::boost::make_move_iterator(aux_vect + 50));
  279. shmset->insert(::boost::make_move_iterator(&aux_vect3[0]), ::boost::make_move_iterator(aux_vect3 + 50));
  280. stdset->insert(aux_vect2, aux_vect2 + 50);
  281. stdset->insert(aux_vect2, aux_vect2 + 50);
  282. shmmultiset->insert(::boost::make_move_iterator(&aux_vect4[0]), ::boost::make_move_iterator(aux_vect4 + 50));
  283. shmmultiset->insert(::boost::make_move_iterator(&aux_vect5[0]), ::boost::make_move_iterator(aux_vect5 + 50));
  284. stdmultiset->insert(aux_vect2, aux_vect2 + 50);
  285. stdmultiset->insert(aux_vect2, aux_vect2 + 50);
  286. if(!CheckEqualContainers(shmset, stdset)){
  287. std::cout << "Error in shmset->insert(::boost::make_move_iterator(&aux_vect3[0])..." << std::endl;
  288. return 1;
  289. }
  290. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  291. std::cout << "Error in shmmultiset->insert(::boost::make_move_iterator(&aux_vect5[0])..." << std::endl;
  292. return 1;
  293. }
  294. shmset->erase(*shmset->begin());
  295. stdset->erase(*stdset->begin());
  296. shmmultiset->erase(*shmmultiset->begin());
  297. stdmultiset->erase(*stdmultiset->begin());
  298. if(!CheckEqualContainers(shmset, stdset)){
  299. std::cout << "Error in shmset->erase(*shmset->begin())" << std::endl;
  300. return 1;
  301. }
  302. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  303. std::cout << "Error in shmmultiset->erase(*shmmultiset->begin())" << std::endl;
  304. return 1;
  305. }
  306. }
  307. for(int i = 0; i < max/2; ++i){
  308. IntType move_me(i);
  309. shmset->insert(shmset->begin(), boost::move(move_me));
  310. stdset->insert(stdset->begin(), i);
  311. IntType move_me2(i);
  312. shmmultiset->insert(shmmultiset->begin(), boost::move(move_me2));
  313. stdmultiset->insert(stdmultiset->begin(), i);
  314. //
  315. shmset->insert(shmset->begin(), IntType(i));
  316. stdset->insert(stdset->begin(), i);
  317. shmmultiset->insert(shmmultiset->begin(), IntType(i));
  318. stdmultiset->insert(stdmultiset->begin(), i);
  319. }
  320. if(!CheckEqualContainers(shmset, stdset)){
  321. std::cout << "Error in shmset->insert(boost::move(move_me)) try 2" << std::endl;
  322. return 1;
  323. }
  324. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  325. std::cout << "Error in shmmultiset->insert(boost::move(move_me2)) try 2" << std::endl;
  326. return 1;
  327. }
  328. for(int i = 0; i < max; ++i){
  329. {
  330. IntType move_me(i);
  331. shmset->insert(shmset->begin(), boost::move(move_me));
  332. stdset->insert(stdset->begin(), i);
  333. //PrintContainers(shmset, stdset);
  334. IntType move_me2(i);
  335. shmmultiset->insert(shmmultiset->begin(), boost::move(move_me2));
  336. stdmultiset->insert(stdmultiset->begin(), i);
  337. //PrintContainers(shmmultiset, stdmultiset);
  338. if(!CheckEqualContainers(shmset, stdset)){
  339. std::cout << "Error in shmset->insert(shmset->begin(), boost::move(move_me))" << std::endl;
  340. return 1;
  341. }
  342. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  343. std::cout << "Error in shmmultiset->insert(shmmultiset->begin(), boost::move(move_me2))" << std::endl;
  344. return 1;
  345. }
  346. IntType move_me3(i);
  347. shmset->insert(shmset->end(), boost::move(move_me3));
  348. stdset->insert(stdset->end(), i);
  349. IntType move_me4(i);
  350. shmmultiset->insert(shmmultiset->end(), boost::move(move_me4));
  351. stdmultiset->insert(stdmultiset->end(), i);
  352. if(!CheckEqualContainers(shmset, stdset)){
  353. std::cout << "Error in shmset->insert(shmset->end(), boost::move(move_me3))" << std::endl;
  354. return 1;
  355. }
  356. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  357. std::cout << "Error in shmmultiset->insert(shmmultiset->end(), boost::move(move_me4))" << std::endl;
  358. return 1;
  359. }
  360. }
  361. {
  362. IntType move_me(i);
  363. shmset->insert(shmset->upper_bound(move_me), boost::move(move_me));
  364. stdset->insert(stdset->upper_bound(i), i);
  365. //PrintContainers(shmset, stdset);
  366. IntType move_me2(i);
  367. shmmultiset->insert(shmmultiset->upper_bound(move_me2), boost::move(move_me2));
  368. stdmultiset->insert(stdmultiset->upper_bound(i), i);
  369. //PrintContainers(shmmultiset, stdmultiset);
  370. if(!CheckEqualContainers(shmset, stdset)){
  371. std::cout << "Error in shmset->insert(shmset->upper_bound(move_me), boost::move(move_me))" << std::endl;
  372. return 1;
  373. }
  374. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  375. std::cout << "Error in shmmultiset->insert(shmmultiset->upper_bound(move_me2), boost::move(move_me2))" << std::endl;
  376. return 1;
  377. }
  378. }
  379. {
  380. IntType move_me(i);
  381. IntType move_me2(i);
  382. shmset->insert(shmset->lower_bound(move_me), boost::move(move_me2));
  383. stdset->insert(stdset->lower_bound(i), i);
  384. //PrintContainers(shmset, stdset);
  385. move_me2 = i;
  386. shmmultiset->insert(shmmultiset->lower_bound(move_me2), boost::move(move_me2));
  387. stdmultiset->insert(stdmultiset->lower_bound(i), i);
  388. //PrintContainers(shmmultiset, stdmultiset);
  389. if(!CheckEqualContainers(shmset, stdset)){
  390. std::cout << "Error in shmset->insert(shmset->lower_bound(move_me), boost::move(move_me2))" << std::endl;
  391. return 1;
  392. }
  393. if(!CheckEqualContainers(shmmultiset, stdmultiset)){
  394. std::cout << "Error in shmmultiset->insert(shmmultiset->lower_bound(move_me2), boost::move(move_me2))" << std::endl;
  395. return 1;
  396. }
  397. }
  398. }
  399. //Compare count with std containers
  400. for(int i = 0; i < max; ++i){
  401. IntType count_me(i);
  402. if(shmset->count(count_me) != stdset->count(i)){
  403. return -1;
  404. }
  405. if(shmmultiset->count(count_me) != stdmultiset->count(i)){
  406. return -1;
  407. }
  408. }
  409. //Now do count exercise
  410. shmset->erase(shmset->begin(), shmset->end());
  411. shmmultiset->erase(shmmultiset->begin(), shmmultiset->end());
  412. shmset->clear();
  413. shmmultiset->clear();
  414. for(int j = 0; j < 3; ++j)
  415. for(int i = 0; i < 100; ++i){
  416. IntType move_me(i);
  417. shmset->insert(boost::move(move_me));
  418. IntType move_me2(i);
  419. shmmultiset->insert(boost::move(move_me2));
  420. IntType count_me(i);
  421. if(shmset->count(count_me) != typename MyShmMultiSet::size_type(1)){
  422. std::cout << "Error in shmset->count(count_me)" << std::endl;
  423. return 1;
  424. }
  425. if(shmmultiset->count(count_me) != typename MyShmMultiSet::size_type(j+1)){
  426. std::cout << "Error in shmmultiset->count(count_me)" << std::endl;
  427. return 1;
  428. }
  429. }
  430. segment.template destroy<MyShmSet>("MyShmSet");
  431. delete stdset;
  432. segment.destroy_ptr(shmmultiset);
  433. delete stdmultiset;
  434. segment.shrink_to_fit_indexes();
  435. if(!segment.all_memory_deallocated()){
  436. std::cout << "Error in segment.all_memory_deallocated()" << std::endl;
  437. return 1;
  438. }
  439. }
  440. catch(...){
  441. shared_memory_object::remove(shMemName);
  442. throw;
  443. }
  444. shared_memory_object::remove(shMemName);
  445. return 0;
  446. }
  447. template<class ManagedSharedMemory
  448. ,class MyShmSet
  449. ,class MyStdSet
  450. ,class MyShmMultiSet
  451. ,class MyStdMultiSet>
  452. int set_test_copyable ()
  453. {
  454. typedef typename MyShmSet::value_type IntType;
  455. const int memsize = 65536;
  456. const char *const shMemName = test::get_process_id_name();
  457. const int max = 100;
  458. try{
  459. //Create shared memory
  460. shared_memory_object::remove(shMemName);
  461. ManagedSharedMemory segment(create_only, shMemName, memsize);
  462. segment.reserve_named_objects(100);
  463. //Shared memory allocator must be always be initialized
  464. //since it has no default constructor
  465. MyShmSet *shmset =
  466. segment.template construct<MyShmSet>("MyShmSet")
  467. (std::less<IntType>(), segment.get_segment_manager());
  468. MyStdSet *stdset = new MyStdSet;
  469. MyShmMultiSet *shmmultiset =
  470. segment.template construct<MyShmMultiSet>("MyShmMultiSet")
  471. (std::less<IntType>(), segment.get_segment_manager());
  472. MyStdMultiSet *stdmultiset = new MyStdMultiSet;
  473. for(int i = 0; i < max; ++i){
  474. IntType move_me(i);
  475. shmset->insert(boost::move(move_me));
  476. stdset->insert(i);
  477. IntType move_me2(i);
  478. shmmultiset->insert(boost::move(move_me2));
  479. stdmultiset->insert(i);
  480. }
  481. if(!CheckEqualContainers(shmset, stdset)) return 1;
  482. if(!CheckEqualContainers(shmmultiset, stdmultiset)) return 1;
  483. {
  484. //Now, test copy constructor
  485. MyShmSet shmsetcopy(*shmset);
  486. MyStdSet stdsetcopy(*stdset);
  487. if(!CheckEqualContainers(&shmsetcopy, &stdsetcopy))
  488. return 1;
  489. MyShmMultiSet shmmsetcopy(*shmmultiset);
  490. MyStdMultiSet stdmsetcopy(*stdmultiset);
  491. if(!CheckEqualContainers(&shmmsetcopy, &stdmsetcopy))
  492. return 1;
  493. //And now assignment
  494. shmsetcopy = *shmset;
  495. stdsetcopy = *stdset;
  496. if(!CheckEqualContainers(&shmsetcopy, &stdsetcopy))
  497. return 1;
  498. shmmsetcopy = *shmmultiset;
  499. stdmsetcopy = *stdmultiset;
  500. if(!CheckEqualContainers(&shmmsetcopy, &stdmsetcopy))
  501. return 1;
  502. }
  503. segment.destroy_ptr(shmset);
  504. segment.destroy_ptr(shmmultiset);
  505. delete stdset;
  506. delete stdmultiset;
  507. segment.shrink_to_fit_indexes();
  508. if(!segment.all_memory_deallocated())
  509. return 1;
  510. }
  511. catch(...){
  512. shared_memory_object::remove(shMemName);
  513. throw;
  514. }
  515. shared_memory_object::remove(shMemName);
  516. return 0;
  517. }
  518. } //namespace test{
  519. } //namespace interprocess{
  520. } //namespace boost{
  521. #include <boost/interprocess/detail/config_end.hpp>
  522. #endif