]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/variant/test/variant_polymorphic_get_test.cpp
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 //-----------------------------------------------------------------------------
6 // Copyright (c) 2003 Eric Friedman
7 // Copyright (c) 2013-2019 Antony Polukhin
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)
13 #include "boost/variant/variant.hpp"
14 #include "boost/variant/apply_visitor.hpp"
15 #include "boost/variant/static_visitor.hpp"
16 #include "boost/variant/polymorphic_get.hpp"
17 #include "boost/core/lightweight_test.hpp"
19 struct base
{int trash
;};
20 struct derived1
: base
{};
21 struct derived2
: base
{};
23 struct vbase
{ short trash
; virtual ~vbase(){} virtual int foo() const { return 0; } };
24 struct vderived1
: virtual vbase
{ virtual int foo() const { return 1; } };
25 struct vderived2
: virtual vbase
{ virtual int foo() const { return 3; } };
26 struct vderived3
: vderived1
, vderived2
{ virtual int foo() const { return 3; } };
28 template <class T
, class Variant
>
29 inline void check_throws(Variant
& v
) {
31 boost::polymorphic_get
<T
>(v
);
33 } catch (const boost::bad_polymorphic_get
& e
) {
34 BOOST_TEST(!!e
.what());
35 BOOST_TEST(std::string(e
.what()) != boost::bad_get().what());
41 typedef boost::variant
<int, base
, derived1
, derived2
> var_t
;
44 BOOST_TEST(!boost::polymorphic_get
<base
>(&var1
));
45 check_throws
<base
>(var1
);
46 BOOST_TEST(!boost::polymorphic_get
<const base
>(&var1
));
47 check_throws
<base
, const var_t
>(var1
);
50 BOOST_TEST(boost::polymorphic_get
<base
>(&var1
));
51 BOOST_TEST(boost::polymorphic_get
<const base
>(&var1
));
56 BOOST_TEST(boost::polymorphic_get
<base
>(var2
).trash
== 777);
57 BOOST_TEST(boost::polymorphic_get
<const base
>(var2
).trash
== 777);
60 BOOST_TEST(!boost::polymorphic_get
<base
>(&var2
));
61 check_throws
<base
>(var2
);
62 BOOST_TEST(!boost::polymorphic_get
<const base
>(&var2
));
63 check_throws
<base
, const var_t
>(var2
);
64 BOOST_TEST(boost::polymorphic_get
<int>(var2
) == 777);
65 BOOST_TEST(boost::polymorphic_get
<const int>(var2
) == 777);
67 typedef boost::variant
<int, vbase
, vderived1
, vderived2
, vderived3
> vvar_t
;
69 vvar_t v
= vderived3();
70 boost::polymorphic_get
<vderived3
>(v
).trash
= 777;
72 BOOST_TEST(boost::polymorphic_get
<vbase
>(cv
).trash
== 777);
73 BOOST_TEST(boost::polymorphic_get
<const vbase
>(cv
).trash
== 777);
75 BOOST_TEST(boost::polymorphic_get
<vbase
>(cv
).foo() == 3);
76 BOOST_TEST(boost::polymorphic_get
<vbase
>(v
).foo() == 3);
77 BOOST_TEST(boost::polymorphic_get
<const vbase
>(cv
).foo() == 3);
78 BOOST_TEST(boost::polymorphic_get
<const vbase
>(v
).foo() == 3);
80 return boost::report_errors();