shared_ptr_alloc_construct11_test.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  2. Copyright 2017 Glen Joseph Fernandes
  3. (glenjofe@gmail.com)
  4. Distributed under the Boost Software License, Version 1.0.
  5. (http://www.boost.org/LICENSE_1_0.txt)
  6. */
  7. #include <boost/core/lightweight_test.hpp>
  8. #include <boost/make_shared.hpp>
  9. #if !defined(BOOST_NO_CXX11_ALLOCATOR)
  10. struct counters {
  11. unsigned allocate;
  12. unsigned construct;
  13. };
  14. template<class T = void>
  15. class creator {
  16. public:
  17. typedef T value_type;
  18. creator(counters* state)
  19. : state_(state) { }
  20. template<class U>
  21. creator(const creator<U>& other)
  22. : state_(other.state()) { }
  23. T* allocate(std::size_t size) {
  24. void* ptr = ::operator new(sizeof(T) * size);
  25. ++state_->allocate;
  26. return static_cast<T*>(ptr);
  27. }
  28. void deallocate(T* ptr, std::size_t) {
  29. ::operator delete(ptr);
  30. --state_->allocate;
  31. }
  32. template<class... Args>
  33. void construct(T* ptr, Args&&... args) {
  34. ::new(static_cast<void*>(ptr)) T(std::forward<Args>(args)...);
  35. ++state_->construct;
  36. }
  37. void destroy(T* ptr) {
  38. ptr->~T();
  39. --state_->construct;
  40. }
  41. counters* state() const {
  42. return state_;
  43. }
  44. private:
  45. counters* state_;
  46. };
  47. template<class T, class U>
  48. inline bool
  49. operator==(const creator<T>& lhs, const creator<U>& rhs)
  50. {
  51. return lhs.state() == rhs.state();
  52. }
  53. template<class T, class U>
  54. inline bool
  55. operator!=(const creator<T>& lhs, const creator<U>& rhs)
  56. {
  57. return !(lhs == rhs);
  58. }
  59. struct deleter {
  60. template<class U>
  61. void operator()(U ptr) const {
  62. delete ptr;
  63. }
  64. };
  65. int main()
  66. {
  67. {
  68. counters state = { };
  69. boost::shared_ptr<int> pointer(new int(), deleter(),
  70. creator<int>(&state));
  71. BOOST_TEST(state.allocate == 1);
  72. BOOST_TEST(state.construct == 0);
  73. pointer.reset();
  74. BOOST_TEST(state.allocate == 0);
  75. }
  76. {
  77. counters state = { };
  78. boost::shared_ptr<int> pointer =
  79. boost::allocate_shared<int>(creator<int>(&state));
  80. BOOST_TEST(state.allocate == 1);
  81. BOOST_TEST(state.construct == 1);
  82. pointer.reset();
  83. BOOST_TEST(state.allocate == 0);
  84. BOOST_TEST(state.construct == 0);
  85. }
  86. {
  87. counters state = { };
  88. boost::shared_ptr<int[]> pointer =
  89. boost::allocate_shared<int[]>(creator<>(&state), 5);
  90. BOOST_TEST(state.allocate == 1);
  91. BOOST_TEST(state.construct == 5);
  92. pointer.reset();
  93. BOOST_TEST(state.allocate == 0);
  94. BOOST_TEST(state.construct == 0);
  95. }
  96. {
  97. counters state = { };
  98. boost::shared_ptr<int[5]> pointer =
  99. boost::allocate_shared<int[5]>(creator<>(&state));
  100. BOOST_TEST(state.allocate == 1);
  101. BOOST_TEST(state.construct == 5);
  102. pointer.reset();
  103. BOOST_TEST(state.allocate == 0);
  104. BOOST_TEST(state.construct == 0);
  105. }
  106. return boost::report_errors();
  107. }
  108. #else
  109. int main()
  110. {
  111. return 0;
  112. }
  113. #endif