deconstruct_test.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // Tests for boost::signals2::deconstruct_ptr and friends
  2. // Copyright Frank Mori Hess 2007-2008.
  3. // Distributed under the Boost Software License, Version
  4. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. // See http://www.boost.org/libs/signals2 for library home page.
  7. #include <boost/enable_shared_from_this.hpp>
  8. #include <boost/shared_ptr.hpp>
  9. #include <boost/signals2/deconstruct.hpp>
  10. #include <boost/signals2/deconstruct_ptr.hpp>
  11. #include <boost/test/minimal.hpp>
  12. class X: public boost::signals2::postconstructible {
  13. public:
  14. X(): _postconstructed(false)
  15. {}
  16. ~X()
  17. {
  18. BOOST_CHECK(_postconstructed);
  19. }
  20. protected:
  21. virtual void postconstruct()
  22. {
  23. BOOST_CHECK(!_postconstructed);
  24. _postconstructed = true;
  25. }
  26. bool _postconstructed;
  27. };
  28. class Y: public boost::signals2::predestructible {
  29. public:
  30. Y(): _predestructed(false)
  31. {}
  32. ~Y()
  33. {
  34. BOOST_CHECK(_predestructed);
  35. }
  36. protected:
  37. virtual void predestruct()
  38. {
  39. _predestructed = true;
  40. }
  41. bool _predestructed;
  42. };
  43. class Z: public X, public Y
  44. {};
  45. class by_deconstruct_only: public boost::signals2::postconstructible {
  46. public:
  47. ~by_deconstruct_only()
  48. {
  49. BOOST_CHECK(_postconstructed);
  50. }
  51. int value;
  52. protected:
  53. virtual void postconstruct()
  54. {
  55. BOOST_CHECK(!_postconstructed);
  56. _postconstructed = true;
  57. }
  58. bool _postconstructed;
  59. private:
  60. friend class boost::signals2::deconstruct_access;
  61. by_deconstruct_only(int value_in):
  62. value(value_in), _postconstructed(false)
  63. {}
  64. };
  65. namespace mytest
  66. {
  67. class A
  68. {
  69. public:
  70. template<typename T> friend
  71. void adl_postconstruct(const boost::shared_ptr<T> &sp, A *p)
  72. {
  73. BOOST_CHECK(!p->_postconstructed);
  74. p->_postconstructed = true;
  75. }
  76. template<typename T> friend
  77. void adl_postconstruct(const boost::shared_ptr<T> &sp, A *p, int val)
  78. {
  79. p->value = val;
  80. BOOST_CHECK(!p->_postconstructed);
  81. p->_postconstructed = true;
  82. }
  83. friend void adl_predestruct(A *p)
  84. {
  85. p->_predestructed = true;
  86. }
  87. ~A()
  88. {
  89. BOOST_CHECK(_postconstructed);
  90. BOOST_CHECK(_predestructed);
  91. }
  92. int value;
  93. private:
  94. friend class boost::signals2::deconstruct_access;
  95. A(int value_in = 0):
  96. value(value_in),
  97. _postconstructed(false),
  98. _predestructed(false)
  99. {}
  100. bool _postconstructed;
  101. bool _predestructed;
  102. };
  103. }
  104. void deconstruct_ptr_test()
  105. {
  106. {
  107. boost::shared_ptr<X> x = boost::signals2::deconstruct_ptr(new X);
  108. }
  109. {
  110. boost::shared_ptr<Y> x = boost::signals2::deconstruct_ptr(new Y);
  111. }
  112. {
  113. boost::shared_ptr<Z> z = boost::signals2::deconstruct_ptr(new Z);
  114. }
  115. }
  116. class deconstructed_esft : public boost::enable_shared_from_this<deconstructed_esft>
  117. {
  118. public:
  119. deconstructed_esft() : x(0) {}
  120. private:
  121. friend void adl_postconstruct(boost::shared_ptr<void>, deconstructed_esft *) {}
  122. int x;
  123. };
  124. void deconstruct_test()
  125. {
  126. {
  127. boost::shared_ptr<X> x = boost::signals2::deconstruct<X>();
  128. }
  129. {
  130. boost::shared_ptr<Y> x = boost::signals2::deconstruct<Y>();
  131. }
  132. {
  133. boost::shared_ptr<Z> z = boost::signals2::deconstruct<Z>();
  134. }
  135. {
  136. boost::shared_ptr<by_deconstruct_only> a = boost::signals2::deconstruct<by_deconstruct_only>(1);
  137. BOOST_CHECK(a->value == 1);
  138. }
  139. {
  140. boost::shared_ptr<mytest::A> a = boost::signals2::deconstruct<mytest::A>(1);
  141. BOOST_CHECK(a->value == 1);
  142. }
  143. {// deconstruct const type
  144. boost::shared_ptr<const mytest::A> a = boost::signals2::deconstruct<const mytest::A>(3);
  145. BOOST_CHECK(a->value == 3);
  146. }
  147. {// passing arguments to postconstructor
  148. boost::shared_ptr<mytest::A> a = boost::signals2::deconstruct<mytest::A>().postconstruct(2);
  149. BOOST_CHECK(a->value == 2);
  150. }
  151. {// enable_shared_from_this with deconstruct
  152. boost::shared_ptr<deconstructed_esft> a = boost::signals2::deconstruct<deconstructed_esft>();
  153. BOOST_CHECK(!(a->shared_from_this() < a || a < a->shared_from_this()));
  154. }
  155. }
  156. int test_main(int, char*[])
  157. {
  158. deconstruct_ptr_test();
  159. deconstruct_test();
  160. return 0;
  161. }