variant_polymorphic_get_test.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //-----------------------------------------------------------------------------
  2. // boost-libs variant/test/variant_plymorphic_get_test.cpp source file
  3. // See http://www.boost.org for updates, documentation, and revision history.
  4. //-----------------------------------------------------------------------------
  5. //
  6. // Copyright (c) 2003 Eric Friedman
  7. // Copyright (c) 2013-2019 Antony Polukhin
  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/variant.hpp"
  13. #include "boost/variant/apply_visitor.hpp"
  14. #include "boost/variant/static_visitor.hpp"
  15. #include "boost/variant/polymorphic_get.hpp"
  16. #include "boost/core/lightweight_test.hpp"
  17. struct base {int trash;};
  18. struct derived1 : base{};
  19. struct derived2 : base{};
  20. struct vbase { short trash; virtual ~vbase(){} virtual int foo() const { return 0; } };
  21. struct vderived1 : virtual vbase{ virtual int foo() const { return 1; } };
  22. struct vderived2 : virtual vbase{ virtual int foo() const { return 3; } };
  23. struct vderived3 : vderived1, vderived2 { virtual int foo() const { return 3; } };
  24. template <class T, class Variant>
  25. inline void check_throws(Variant& v) {
  26. try {
  27. boost::polymorphic_get<T>(v);
  28. BOOST_TEST(false);
  29. } catch (const boost::bad_polymorphic_get& e) {
  30. BOOST_TEST(!!e.what());
  31. BOOST_TEST(std::string(e.what()) != boost::bad_get().what());
  32. }
  33. }
  34. int main()
  35. {
  36. typedef boost::variant<int, base, derived1, derived2> var_t;
  37. var_t var1;
  38. BOOST_TEST(!boost::polymorphic_get<base>(&var1));
  39. check_throws<base>(var1);
  40. BOOST_TEST(!boost::polymorphic_get<const base>(&var1));
  41. check_throws<base, const var_t>(var1);
  42. var1 = derived1();
  43. BOOST_TEST(boost::polymorphic_get<base>(&var1));
  44. BOOST_TEST(boost::polymorphic_get<const base>(&var1));
  45. derived2 d;
  46. d.trash = 777;
  47. var_t var2 = d;
  48. BOOST_TEST(boost::polymorphic_get<base>(var2).trash == 777);
  49. BOOST_TEST(boost::polymorphic_get<const base>(var2).trash == 777);
  50. var2 = 777;
  51. BOOST_TEST(!boost::polymorphic_get<base>(&var2));
  52. check_throws<base>(var2);
  53. BOOST_TEST(!boost::polymorphic_get<const base>(&var2));
  54. check_throws<base, const var_t>(var2);
  55. BOOST_TEST(boost::polymorphic_get<int>(var2) == 777);
  56. BOOST_TEST(boost::polymorphic_get<const int>(var2) == 777);
  57. typedef boost::variant<int, vbase, vderived1, vderived2, vderived3> vvar_t;
  58. vvar_t v = vderived3();
  59. boost::polymorphic_get<vderived3>(v).trash = 777;
  60. const vvar_t& cv = v;
  61. BOOST_TEST(boost::polymorphic_get<vbase>(cv).trash == 777);
  62. BOOST_TEST(boost::polymorphic_get<const vbase>(cv).trash == 777);
  63. BOOST_TEST(boost::polymorphic_get<vbase>(cv).foo() == 3);
  64. BOOST_TEST(boost::polymorphic_get<vbase>(v).foo() == 3);
  65. BOOST_TEST(boost::polymorphic_get<const vbase>(cv).foo() == 3);
  66. BOOST_TEST(boost::polymorphic_get<const vbase>(v).foo() == 3);
  67. return boost::report_errors();
  68. }