unique_ptr_test.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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/offset_ptr.hpp>
  12. #include <boost/interprocess/smart_ptr/unique_ptr.hpp>
  13. #include <boost/interprocess/managed_shared_memory.hpp>
  14. #include <boost/interprocess/allocators/allocator.hpp>
  15. #include <boost/interprocess/containers/list.hpp>
  16. #include <boost/interprocess/containers/set.hpp>
  17. #include <boost/interprocess/containers/vector.hpp>
  18. #include <boost/interprocess/smart_ptr/deleter.hpp>
  19. #include <stdio.h>
  20. #include <string>
  21. #include "get_process_id_name.hpp"
  22. using namespace boost::interprocess;
  23. class MyClass
  24. {
  25. public:
  26. MyClass()
  27. {}
  28. };
  29. typedef managed_unique_ptr<MyClass, managed_shared_memory>::type my_unique_ptr_class;
  30. typedef set <my_unique_ptr_class
  31. ,std::less<my_unique_ptr_class>
  32. ,allocator <my_unique_ptr_class
  33. ,managed_shared_memory::segment_manager>
  34. > MySet;
  35. typedef list<my_unique_ptr_class
  36. ,allocator <my_unique_ptr_class
  37. ,managed_shared_memory::segment_manager>
  38. > MyList;
  39. typedef vector <my_unique_ptr_class
  40. ,allocator <my_unique_ptr_class
  41. ,managed_shared_memory::segment_manager>
  42. > MyVector;
  43. int main()
  44. {
  45. std::string process_name;
  46. test::get_process_id_name(process_name);
  47. //Create managed shared memory
  48. shared_memory_object::remove(process_name.c_str());
  49. {
  50. managed_shared_memory segment(create_only, process_name.c_str(), 10000);
  51. //Create unique_ptr using dynamic allocation
  52. my_unique_ptr_class my_ptr (segment.construct<MyClass>(anonymous_instance)()
  53. ,segment.get_deleter<MyClass>());
  54. my_unique_ptr_class my_ptr2(segment.construct<MyClass>(anonymous_instance)()
  55. ,segment.get_deleter<MyClass>());
  56. //Backup relative pointers to future tests
  57. offset_ptr<MyClass> ptr1 = my_ptr.get();
  58. offset_ptr<MyClass> ptr2 = my_ptr2.get();
  59. //Test some copy constructors
  60. my_unique_ptr_class my_ptr3(0, segment.get_deleter<MyClass>());
  61. my_unique_ptr_class my_ptr4(boost::move(my_ptr3));
  62. //Construct a list and fill
  63. MyList list(segment.get_segment_manager());
  64. //Insert from my_unique_ptr_class
  65. list.push_front(boost::move(my_ptr));
  66. list.push_back(boost::move(my_ptr2));
  67. //Check pointers
  68. assert(my_ptr.get() == 0);
  69. assert(my_ptr2.get() == 0);
  70. assert(list.begin()->get() == ptr1);
  71. assert(list.rbegin()->get() == ptr2);
  72. //Construct a set and fill
  73. typedef std::less<my_unique_ptr_class> set_less_t;
  74. MySet set(set_less_t(), segment.get_segment_manager());
  75. //Insert in set from list passing ownership
  76. set.insert(boost::move(*list.begin()));
  77. set.insert(boost::move(*list.rbegin()));
  78. //Check pointers
  79. assert(list.begin()->get() == 0);
  80. assert(list.rbegin()->get()== 0);
  81. //A set is ordered by std::less<my_unique_ptr_class> so
  82. //be careful when comparing pointers
  83. if(ptr1 < ptr2){
  84. assert(set.begin()->get() == ptr1);
  85. assert(set.rbegin()->get() == ptr2);
  86. }
  87. else{
  88. assert(set.rbegin()->get() == ptr1);
  89. assert(set.begin()->get() == ptr2);
  90. }
  91. //Now with vector
  92. MyVector vector(segment.get_segment_manager());
  93. //Insert from my_unique_ptr_class
  94. if(ptr1 < ptr2){
  95. vector.insert(vector.begin(), boost::move(*set.begin()));
  96. vector.insert(vector.end(), boost::move(*set.rbegin()));
  97. }
  98. else{
  99. vector.insert(vector.begin(), boost::move(*set.rbegin()));
  100. vector.insert(vector.end(), boost::move(*set.begin()));
  101. }
  102. //Check pointers
  103. assert(my_ptr.get() == 0);
  104. assert(my_ptr2.get() == 0);
  105. assert(vector.begin()->get() == ptr1);
  106. assert(vector.rbegin()->get() == ptr2);
  107. MyVector vector2(boost::move(vector));
  108. vector2.swap(vector);
  109. assert(vector.begin()->get() == ptr1);
  110. assert(vector.rbegin()->get() == ptr2);
  111. my_unique_ptr_class a(0, segment.get_deleter<MyClass>()), b(0, segment.get_deleter<MyClass>());
  112. a = boost::move(b);
  113. }
  114. shared_memory_object::remove(process_name.c_str());
  115. return 0;
  116. }
  117. #include <boost/interprocess/detail/config_end.hpp>