allocate_unique_array_construct_test.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /*
  2. Copyright 2019 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/config.hpp>
  8. #if (!defined(BOOST_LIBSTDCXX_VERSION) || \
  9. BOOST_LIBSTDCXX_VERSION >= 48000) && \
  10. !defined(BOOST_NO_CXX11_SMART_PTR) && \
  11. !defined(BOOST_NO_CXX11_ALLOCATOR)
  12. #include <boost/smart_ptr/allocate_unique.hpp>
  13. #include <boost/core/lightweight_test.hpp>
  14. struct allow { };
  15. template<class T = void>
  16. struct creator {
  17. typedef T value_type;
  18. template<class U>
  19. struct rebind {
  20. typedef creator<U> other;
  21. };
  22. creator() { }
  23. template<class U>
  24. creator(const creator<U>&) { }
  25. T* allocate(std::size_t size) {
  26. return static_cast<T*>(::operator new(sizeof(T) * size));
  27. }
  28. void deallocate(T* ptr, std::size_t) {
  29. ::operator delete(ptr);
  30. }
  31. template<class U>
  32. void construct(U* ptr) {
  33. ::new(static_cast<void*>(ptr)) U(allow());
  34. }
  35. template<class U>
  36. void destroy(U* ptr) {
  37. ptr->~U();
  38. }
  39. };
  40. template<class T, class U>
  41. inline bool
  42. operator==(const creator<T>&, const creator<U>&)
  43. {
  44. return true;
  45. }
  46. template<class T, class U>
  47. inline bool
  48. operator!=(const creator<T>&, const creator<U>&)
  49. {
  50. return false;
  51. }
  52. class type {
  53. public:
  54. static unsigned instances;
  55. explicit type(allow) {
  56. ++instances;
  57. }
  58. ~type() {
  59. --instances;
  60. }
  61. private:
  62. type(const type&);
  63. type& operator=(const type&);
  64. };
  65. unsigned type::instances = 0;
  66. int main()
  67. {
  68. {
  69. std::unique_ptr<type[],
  70. boost::alloc_deleter<type[], creator<type> > > result =
  71. boost::allocate_unique<type[]>(creator<type>(), 3);
  72. BOOST_TEST(result.get() != 0);
  73. BOOST_TEST(type::instances == 3);
  74. result.reset();
  75. BOOST_TEST(type::instances == 0);
  76. }
  77. {
  78. std::unique_ptr<type[],
  79. boost::alloc_deleter<type[3], creator<type> > > result =
  80. boost::allocate_unique<type[3]>(creator<type>());
  81. BOOST_TEST(result.get() != 0);
  82. BOOST_TEST(type::instances == 3);
  83. result.reset();
  84. BOOST_TEST(type::instances == 0);
  85. }
  86. {
  87. std::unique_ptr<type[][2],
  88. boost::alloc_deleter<type[][2], creator<> > > result =
  89. boost::allocate_unique<type[][2]>(creator<>(), 2);
  90. BOOST_TEST(result.get() != 0);
  91. BOOST_TEST(type::instances == 4);
  92. result.reset();
  93. BOOST_TEST(type::instances == 0);
  94. }
  95. {
  96. std::unique_ptr<type[][2],
  97. boost::alloc_deleter<type[2][2], creator<> > > result =
  98. boost::allocate_unique<type[2][2]>(creator<>());
  99. BOOST_TEST(result.get() != 0);
  100. BOOST_TEST(type::instances == 4);
  101. result.reset();
  102. BOOST_TEST(type::instances == 0);
  103. }
  104. {
  105. std::unique_ptr<const type[],
  106. boost::alloc_deleter<const type[], creator<> > > result =
  107. boost::allocate_unique<const type[]>(creator<>(), 3);
  108. BOOST_TEST(result.get() != 0);
  109. BOOST_TEST(type::instances == 3);
  110. result.reset();
  111. BOOST_TEST(type::instances == 0);
  112. }
  113. {
  114. std::unique_ptr<const type[],
  115. boost::alloc_deleter<const type[3], creator<> > > result =
  116. boost::allocate_unique<const type[3]>(creator<>());
  117. BOOST_TEST(result.get() != 0);
  118. BOOST_TEST(type::instances == 3);
  119. result.reset();
  120. BOOST_TEST(type::instances == 0);
  121. }
  122. {
  123. std::unique_ptr<const type[][2],
  124. boost::alloc_deleter<const type[][2], creator<> > > result =
  125. boost::allocate_unique<const type[][2]>(creator<>(), 2);
  126. BOOST_TEST(result.get() != 0);
  127. BOOST_TEST(type::instances == 4);
  128. result.reset();
  129. BOOST_TEST(type::instances == 0);
  130. }
  131. {
  132. std::unique_ptr<const type[][2],
  133. boost::alloc_deleter<const type[2][2], creator<> > > result =
  134. boost::allocate_unique<const type[2][2]>(creator<>());
  135. BOOST_TEST(result.get() != 0);
  136. BOOST_TEST(type::instances == 4);
  137. result.reset();
  138. BOOST_TEST(type::instances == 0);
  139. }
  140. return boost::report_errors();
  141. }
  142. #else
  143. int main()
  144. {
  145. return 0;
  146. }
  147. #endif