parent_from_member_test.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2014-2014
  4. //
  5. // Distributed under the Boost Software License, Version 1.0.
  6. // (See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. //
  9. // See http://www.boost.org/libs/intrusive for documentation.
  10. //
  11. /////////////////////////////////////////////////////////////////////////////
  12. #include <boost/intrusive/parent_from_member.hpp>
  13. #include <boost/core/lightweight_test.hpp>
  14. struct POD
  15. {
  16. int int_;
  17. float float_;
  18. }pod;
  19. struct Derived
  20. : public POD
  21. {
  22. int derived_int_;
  23. float derived_float_;
  24. }derived;
  25. struct Abstract
  26. {
  27. int abstract_int_;
  28. float abstract_float_;
  29. virtual void virtual_func1() = 0;
  30. virtual void virtual_func2() = 0;
  31. virtual ~Abstract(){}
  32. };
  33. struct DerivedPoly
  34. : public Abstract
  35. {
  36. int derivedpoly_int_;
  37. float derivedpoly_float_;
  38. virtual void virtual_func1(){}
  39. virtual void virtual_func2(){}
  40. Abstract *abstract() { return this; }
  41. Abstract const *abstract() const { return this; }
  42. } derivedpoly;
  43. struct MultiInheritance
  44. : public Derived, public DerivedPoly
  45. {
  46. int multiinheritance_int_;
  47. float multiinheritance_float_;
  48. } multiinheritance;
  49. struct Abstract2
  50. {
  51. int abstract2_int_;
  52. float abstract2_float_;
  53. virtual void virtual_func1() = 0;
  54. virtual void virtual_func2() = 0;
  55. virtual ~Abstract2(){}
  56. };
  57. struct DerivedPoly2
  58. : public Abstract2
  59. {
  60. int derivedpoly2_int_;
  61. float derivedpoly2_float_;
  62. virtual void virtual_func1(){}
  63. virtual void virtual_func2(){}
  64. Abstract2 *abstract2() { return this; }
  65. Abstract2 const *abstract2() const { return this; }
  66. virtual ~DerivedPoly2(){}
  67. } derivedpoly2;
  68. struct MultiInheritance2
  69. : public DerivedPoly, public DerivedPoly2
  70. {
  71. int multiinheritance2_int_;
  72. float multiinheritance2_float_;
  73. } multiinheritance2;
  74. struct VirtualDerivedPoly
  75. : public virtual Derived
  76. {
  77. int virtualderivedpoly_int_;
  78. float virtualderivedpoly_float_;
  79. virtual void f1(){}
  80. virtual void f2(){}
  81. virtual ~VirtualDerivedPoly(){}
  82. } virtualderivedpoly;
  83. struct VirtualMultipleDerivedPoly
  84. : public virtual Derived, virtual public DerivedPoly
  85. {
  86. int virtualmultiplederivedpoly_int_;
  87. float virtualmultiplederivedpoly_float_;
  88. virtual void f1(){}
  89. virtual void f2(){}
  90. virtual ~VirtualMultipleDerivedPoly(){}
  91. } virtualmultiplederivedpoly;
  92. struct VirtualDerived
  93. : public virtual Derived
  94. {
  95. int virtualderived_int_;
  96. float virtualderived_float_;
  97. virtual void f1(){}
  98. virtual void f2(){}
  99. virtual ~VirtualDerived(){}
  100. } virtualderived;
  101. using namespace boost::intrusive;
  102. //Add new test with https://svn.boost.org/trac/boost/attachment/ticket/8512/Source1.cpp
  103. int main()
  104. {
  105. //POD
  106. BOOST_TEST(&pod == get_parent_from_member(&pod.int_, &POD::int_));
  107. BOOST_TEST(&pod == get_parent_from_member(&pod.float_, &POD::float_));
  108. //Derived
  109. BOOST_TEST(&derived == get_parent_from_member(&derived.int_, &Derived::int_));
  110. BOOST_TEST(&derived == get_parent_from_member(&derived.float_, &Derived::float_));
  111. BOOST_TEST(&derived == get_parent_from_member(&derived.derived_int_, &Derived::derived_int_));
  112. BOOST_TEST(&derived == get_parent_from_member(&derived.derived_float_, &Derived::derived_float_));
  113. //Abstract
  114. BOOST_TEST(derivedpoly.abstract() == get_parent_from_member(&derivedpoly.abstract_int_, &Abstract::abstract_int_));
  115. BOOST_TEST(derivedpoly.abstract() == get_parent_from_member(&derivedpoly.abstract_float_, &Abstract::abstract_float_));
  116. //DerivedPoly
  117. BOOST_TEST(&derivedpoly == get_parent_from_member(&derivedpoly.abstract_int_, &DerivedPoly::abstract_int_));
  118. BOOST_TEST(&derivedpoly == get_parent_from_member(&derivedpoly.abstract_float_, &DerivedPoly::abstract_float_));
  119. BOOST_TEST(&derivedpoly == get_parent_from_member(&derivedpoly.derivedpoly_int_, &DerivedPoly::derivedpoly_int_));
  120. BOOST_TEST(&derivedpoly == get_parent_from_member(&derivedpoly.derivedpoly_float_, &DerivedPoly::derivedpoly_float_));
  121. //MultiInheritance
  122. BOOST_TEST(multiinheritance.abstract() == get_parent_from_member(&multiinheritance.abstract_int_, &MultiInheritance::abstract_int_));
  123. BOOST_TEST(multiinheritance.abstract() == get_parent_from_member(&multiinheritance.abstract_float_, &MultiInheritance::abstract_float_));
  124. BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.derivedpoly_int_, &MultiInheritance::derivedpoly_int_));
  125. BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.derivedpoly_float_, &MultiInheritance::derivedpoly_float_));
  126. BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.int_, &MultiInheritance::int_));
  127. BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.float_, &MultiInheritance::float_));
  128. BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.derived_int_, &MultiInheritance::derived_int_));
  129. BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.derived_float_, &MultiInheritance::derived_float_));
  130. BOOST_TEST(multiinheritance.abstract() == get_parent_from_member(&multiinheritance.abstract_int_, &MultiInheritance::abstract_int_));
  131. BOOST_TEST(multiinheritance.abstract() == get_parent_from_member(&multiinheritance.abstract_float_, &MultiInheritance::abstract_float_));
  132. BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.derivedpoly_int_, &MultiInheritance::derivedpoly_int_));
  133. BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.derivedpoly_float_, &MultiInheritance::derivedpoly_float_));
  134. BOOST_TEST(multiinheritance2.abstract2() == get_parent_from_member(&multiinheritance2.abstract2_int_, &MultiInheritance2::abstract2_int_));
  135. BOOST_TEST(multiinheritance2.abstract2() == get_parent_from_member(&multiinheritance2.abstract2_float_, &MultiInheritance2::abstract2_float_));
  136. BOOST_TEST(&multiinheritance2 == get_parent_from_member(&multiinheritance2.derivedpoly2_int_, &MultiInheritance2::derivedpoly2_int_));
  137. BOOST_TEST(&multiinheritance2 == get_parent_from_member(&multiinheritance2.derivedpoly2_float_, &MultiInheritance2::derivedpoly2_float_));
  138. //MSVC pointer to member data uses RTTI info even when not crossing virtual base boundaries
  139. #ifndef BOOST_INTRUSIVE_MSVC_ABI_PTR_TO_MEMBER
  140. BOOST_TEST(&virtualderived == get_parent_from_member(&virtualderived.virtualderived_int_, &VirtualDerived::virtualderived_int_));
  141. BOOST_TEST(&virtualderived == get_parent_from_member(&virtualderived.virtualderived_float_, &VirtualDerived::virtualderived_float_));
  142. BOOST_TEST(&virtualderivedpoly == get_parent_from_member(&virtualderivedpoly.virtualderivedpoly_int_, &VirtualDerivedPoly::virtualderivedpoly_int_));
  143. BOOST_TEST(&virtualderivedpoly == get_parent_from_member(&virtualderivedpoly.virtualderivedpoly_float_, &VirtualDerivedPoly::virtualderivedpoly_float_));
  144. BOOST_TEST(&virtualmultiplederivedpoly == get_parent_from_member(&virtualmultiplederivedpoly.virtualmultiplederivedpoly_float_, &VirtualMultipleDerivedPoly::virtualmultiplederivedpoly_float_));
  145. BOOST_TEST(&virtualmultiplederivedpoly == get_parent_from_member(&virtualmultiplederivedpoly.virtualmultiplederivedpoly_int_, &VirtualMultipleDerivedPoly::virtualmultiplederivedpoly_int_));
  146. BOOST_TEST(&virtualmultiplederivedpoly == get_parent_from_member(&virtualmultiplederivedpoly.derivedpoly_float_, &VirtualMultipleDerivedPoly::derivedpoly_float_));
  147. BOOST_TEST(&virtualmultiplederivedpoly == get_parent_from_member(&virtualmultiplederivedpoly.derivedpoly_int_, &VirtualMultipleDerivedPoly::derivedpoly_int_));
  148. #endif
  149. return boost::report_errors();
  150. }