vector_test.hpp 9.0 KB

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