deque_test.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  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. #include <boost/interprocess/detail/config_begin.hpp>
  11. #include <memory>
  12. #include <deque>
  13. #include <iostream>
  14. #include <list>
  15. #include <boost/interprocess/managed_shared_memory.hpp>
  16. #include <boost/interprocess/containers/deque.hpp>
  17. #include <boost/interprocess/indexes/flat_map_index.hpp>
  18. #include "print_container.hpp"
  19. #include "check_equal_containers.hpp"
  20. #include "dummy_test_allocator.hpp"
  21. #include "movable_int.hpp"
  22. #include <boost/interprocess/allocators/allocator.hpp>
  23. #include "allocator_v1.hpp"
  24. #include <boost/interprocess/exceptions.hpp>
  25. #include <boost/move/utility_core.hpp>
  26. #include <boost/interprocess/detail/mpl.hpp>
  27. #include <boost/interprocess/detail/type_traits.hpp>
  28. #include <string>
  29. #include "get_process_id_name.hpp"
  30. #include "emplace_test.hpp"
  31. ///////////////////////////////////////////////////////////////////
  32. // //
  33. // This example repeats the same operations with std::deque and //
  34. // shmem_deque using the node allocator //
  35. // and compares the values of both containers //
  36. // //
  37. ///////////////////////////////////////////////////////////////////
  38. using namespace boost::interprocess;
  39. //Function to check if both sets are equal
  40. template<class V1, class V2>
  41. bool copyable_only(V1 *, V2 *, ipcdetail::false_type)
  42. {
  43. return true;
  44. }
  45. //Function to check if both sets are equal
  46. template<class V1, class V2>
  47. bool copyable_only(V1 *shmdeque, V2 *stddeque, ipcdetail::true_type)
  48. {
  49. typedef typename V1::value_type IntType;
  50. std::size_t size = shmdeque->size();
  51. stddeque->insert(stddeque->end(), 50, 1);
  52. shmdeque->insert(shmdeque->end(), 50, IntType(1));
  53. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  54. {
  55. IntType move_me(1);
  56. stddeque->insert(stddeque->begin()+size/2, 50, 1);
  57. shmdeque->insert(shmdeque->begin()+size/2, 50, boost::move(move_me));
  58. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  59. }
  60. {
  61. IntType move_me(2);
  62. shmdeque->assign(shmdeque->size()/2, boost::move(move_me));
  63. stddeque->assign(stddeque->size()/2, 2);
  64. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  65. }
  66. {
  67. IntType move_me(1);
  68. stddeque->clear();
  69. shmdeque->clear();
  70. stddeque->insert(stddeque->begin(), 50, 1);
  71. shmdeque->insert(shmdeque->begin(), 50, boost::move(move_me));
  72. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  73. stddeque->insert(stddeque->begin()+20, 50, 1);
  74. shmdeque->insert(shmdeque->begin()+20, 50, boost::move(move_me));
  75. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  76. stddeque->insert(stddeque->begin()+20, 20, 1);
  77. shmdeque->insert(shmdeque->begin()+20, 20, boost::move(move_me));
  78. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  79. }
  80. {
  81. IntType move_me(1);
  82. stddeque->clear();
  83. shmdeque->clear();
  84. stddeque->insert(stddeque->end(), 50, 1);
  85. shmdeque->insert(shmdeque->end(), 50, boost::move(move_me));
  86. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  87. stddeque->insert(stddeque->end()-20, 50, 1);
  88. shmdeque->insert(shmdeque->end()-20, 50, boost::move(move_me));
  89. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  90. stddeque->insert(stddeque->end()-20, 20, 1);
  91. shmdeque->insert(shmdeque->end()-20, 20, boost::move(move_me));
  92. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  93. }
  94. return true;
  95. }
  96. template<class IntType, template<class T, class SegmentManager> class AllocatorType >
  97. bool do_test()
  98. {
  99. //Customize managed_shared_memory class
  100. typedef basic_managed_shared_memory
  101. <char,
  102. //simple_seq_fit<mutex_family>,
  103. rbtree_best_fit<mutex_family>,
  104. //flat_map_index
  105. iset_index
  106. > my_managed_shared_memory;
  107. //Alias AllocatorType type
  108. typedef AllocatorType<IntType, my_managed_shared_memory::segment_manager>
  109. shmem_allocator_t;
  110. //Alias deque types
  111. typedef deque<IntType, shmem_allocator_t> MyShmDeque;
  112. typedef std::deque<int> MyStdDeque;
  113. const int Memsize = 65536;
  114. const char *const shMemName = test::get_process_id_name();
  115. const int max = 100;
  116. /*try*/{
  117. shared_memory_object::remove(shMemName);
  118. //Create shared memory
  119. my_managed_shared_memory segment(create_only, shMemName, Memsize);
  120. segment.reserve_named_objects(100);
  121. //Shared memory allocator must be always be initialized
  122. //since it has no default constructor
  123. MyShmDeque *shmdeque = segment.template construct<MyShmDeque>("MyShmDeque")
  124. (segment.get_segment_manager());
  125. MyStdDeque *stddeque = new MyStdDeque;
  126. /*try*/{
  127. //Compare several shared memory deque operations with std::deque
  128. for(int i = 0; i < max*50; ++i){
  129. IntType move_me(i);
  130. shmdeque->insert(shmdeque->end(), boost::move(move_me));
  131. stddeque->insert(stddeque->end(), i);
  132. shmdeque->insert(shmdeque->end(), IntType(i));
  133. stddeque->insert(stddeque->end(), int(i));
  134. }
  135. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  136. shmdeque->clear();
  137. stddeque->clear();
  138. for(int i = 0; i < max*50; ++i){
  139. IntType move_me(i);
  140. shmdeque->push_back(boost::move(move_me));
  141. stddeque->push_back(i);
  142. shmdeque->push_back(IntType(i));
  143. stddeque->push_back(i);
  144. }
  145. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  146. shmdeque->clear();
  147. stddeque->clear();
  148. for(int i = 0; i < max*50; ++i){
  149. IntType move_me(i);
  150. shmdeque->push_front(boost::move(move_me));
  151. stddeque->push_front(i);
  152. shmdeque->push_front(IntType(i));
  153. stddeque->push_front(int(i));
  154. }
  155. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  156. typename MyShmDeque::iterator it;
  157. typename MyShmDeque::const_iterator cit = it;
  158. (void)cit;
  159. shmdeque->erase(shmdeque->begin()++);
  160. stddeque->erase(stddeque->begin()++);
  161. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  162. shmdeque->erase(shmdeque->begin());
  163. stddeque->erase(stddeque->begin());
  164. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  165. {
  166. //Initialize values
  167. IntType aux_vect[50];
  168. for(int i = 0; i < 50; ++i){
  169. IntType move_me (-1);
  170. aux_vect[i] = boost::move(move_me);
  171. }
  172. int aux_vect2[50];
  173. for(int i = 0; i < 50; ++i){
  174. aux_vect2[i] = -1;
  175. }
  176. shmdeque->insert(shmdeque->end()
  177. ,::boost::make_move_iterator(&aux_vect[0])
  178. ,::boost::make_move_iterator(aux_vect + 50));
  179. stddeque->insert(stddeque->end(), aux_vect2, aux_vect2 + 50);
  180. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  181. for(int i = 0, j = static_cast<int>(shmdeque->size()); i < j; ++i){
  182. shmdeque->erase(shmdeque->begin());
  183. stddeque->erase(stddeque->begin());
  184. }
  185. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  186. }
  187. {
  188. IntType aux_vect[50];
  189. for(int i = 0; i < 50; ++i){
  190. IntType move_me(-1);
  191. aux_vect[i] = boost::move(move_me);
  192. }
  193. int aux_vect2[50];
  194. for(int i = 0; i < 50; ++i){
  195. aux_vect2[i] = -1;
  196. }
  197. shmdeque->insert(shmdeque->begin()
  198. ,::boost::make_move_iterator(&aux_vect[0])
  199. ,::boost::make_move_iterator(aux_vect + 50));
  200. stddeque->insert(stddeque->begin(), aux_vect2, aux_vect2 + 50);
  201. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  202. }
  203. if(!copyable_only(shmdeque, stddeque
  204. ,ipcdetail::bool_<!ipcdetail::is_same<IntType, test::movable_int>::value>())){
  205. return false;
  206. }
  207. shmdeque->erase(shmdeque->begin());
  208. stddeque->erase(stddeque->begin());
  209. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  210. for(int i = 0; i < max; ++i){
  211. IntType move_me(i);
  212. shmdeque->insert(shmdeque->begin(), boost::move(move_me));
  213. stddeque->insert(stddeque->begin(), i);
  214. }
  215. if(!test::CheckEqualContainers(shmdeque, stddeque)) return false;
  216. //Test insertion from list
  217. {
  218. std::list<int> l(50, int(1));
  219. shmdeque->insert(shmdeque->begin(), l.begin(), l.end());
  220. stddeque->insert(stddeque->begin(), l.begin(), l.end());
  221. if(!test::CheckEqualContainers(shmdeque, stddeque)) return 1;
  222. shmdeque->assign(l.begin(), l.end());
  223. stddeque->assign(l.begin(), l.end());
  224. if(!test::CheckEqualContainers(shmdeque, stddeque)) return 1;
  225. }
  226. shmdeque->resize(100);
  227. stddeque->resize(100);
  228. if(!test::CheckEqualContainers(shmdeque, stddeque)) return 1;
  229. shmdeque->resize(200);
  230. stddeque->resize(200);
  231. if(!test::CheckEqualContainers(shmdeque, stddeque)) return 1;
  232. segment.template destroy<MyShmDeque>("MyShmDeque");
  233. delete stddeque;
  234. segment.shrink_to_fit_indexes();
  235. if(!segment.all_memory_deallocated())
  236. return false;
  237. }/*
  238. catch(std::exception &ex){
  239. std::cout << ex.what() << std::endl;
  240. return false;
  241. }*/
  242. std::cout << std::endl << "Test OK!" << std::endl;
  243. }/*
  244. catch(...){
  245. shared_memory_object::remove(shMemName);
  246. throw;
  247. }*/
  248. shared_memory_object::remove(shMemName);
  249. return true;
  250. }
  251. int main ()
  252. {
  253. if(!do_test<int, allocator>())
  254. return 1;
  255. if(!do_test<test::movable_int, allocator>())
  256. return 1;
  257. if(!do_test<test::copyable_int, allocator>())
  258. return 1;
  259. if(!do_test<int, test::allocator_v1>())
  260. return 1;
  261. const test::EmplaceOptions Options = (test::EmplaceOptions)(test::EMPLACE_BACK | test::EMPLACE_FRONT | test::EMPLACE_BEFORE);
  262. if(!boost::interprocess::test::test_emplace
  263. < deque<test::EmplaceInt>, Options>())
  264. return 1;
  265. return 0;
  266. }
  267. #include <boost/interprocess/detail/config_end.hpp>