variant_reference_test.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //-----------------------------------------------------------------------------
  2. // boost-libs variant/test/variant_reference_test.cpp source file
  3. // See http://www.boost.org for updates, documentation, and revision history.
  4. //-----------------------------------------------------------------------------
  5. //
  6. // Copyright (c) 2003
  7. // Eric Friedman, Itay Maman
  8. //
  9. // Distributed under the Boost Software License, Version 1.0. (See
  10. // accompanying file LICENSE_1_0.txt or copy at
  11. // http://www.boost.org/LICENSE_1_0.txt)
  12. #include "boost/variant.hpp"
  13. #include "boost/core/lightweight_test.hpp"
  14. #include "boost/mpl/bool.hpp"
  15. #include "boost/type_traits/add_reference.hpp"
  16. #include "boost/type_traits/is_pointer.hpp"
  17. /////
  18. // support types and functions
  19. struct base_t { };
  20. struct derived_t : base_t { };
  21. template <typename Base, typename Derived>
  22. bool check_base_derived(Base* b, Derived* d, long)
  23. {
  24. return b == d;
  25. }
  26. template <typename Base, typename Derived>
  27. bool check_base_derived(Base& b, Derived& d, int)
  28. {
  29. return &b == &d;
  30. }
  31. template <typename T>
  32. typename boost::add_reference<T>::type
  33. wknd_get(boost::variant<T&>& var, long)
  34. {
  35. return boost::get<T>(var);
  36. }
  37. template <typename T>
  38. typename boost::add_reference<T>::type
  39. wknd_get(boost::variant<T>& var, int)
  40. {
  41. return boost::get<T>(var);
  42. }
  43. /////
  44. // test functions
  45. template <typename T>
  46. void test_reference_content(T& t, const T& value1, const T& value2)
  47. {
  48. BOOST_TEST( !(value1 == value2) );
  49. /////
  50. boost::variant< T& > var(t);
  51. BOOST_TEST(( boost::get<T>(&var) == &t ));
  52. t = value1;
  53. BOOST_TEST(( boost::get<T>(var) == value1 ));
  54. /////
  55. boost::variant< T > var2(var);
  56. BOOST_TEST(( boost::get<T>(var2) == value1 ));
  57. t = value2;
  58. BOOST_TEST(( boost::get<T>(var2) == value1 ));
  59. }
  60. template <typename Base, typename Derived>
  61. void base_derived_test(Derived d)
  62. {
  63. Base b(d);
  64. BOOST_TEST((check_base_derived(
  65. b
  66. , d
  67. , 1L
  68. )));
  69. boost::variant<Base> base_var(d);
  70. BOOST_TEST((check_base_derived(
  71. wknd_get(base_var, 1L)
  72. , d
  73. , 1L
  74. )));
  75. boost::variant<Derived> derived_var(d);
  76. boost::variant<Base> base_from_derived_var(derived_var);
  77. BOOST_TEST((check_base_derived(
  78. wknd_get(base_from_derived_var, 1L)
  79. , wknd_get(derived_var, 1L)
  80. , 1L
  81. )));
  82. }
  83. int main()
  84. {
  85. int i = 0;
  86. test_reference_content(i, 1, 2);
  87. /////
  88. derived_t d;
  89. base_derived_test< int&,int >(i);
  90. base_derived_test< base_t*,derived_t* >(&d);
  91. base_derived_test< base_t&,derived_t& >(d);
  92. return boost::report_errors();
  93. }