1 /*=============================================================================
2     Copyright (c) 2001-2007 Joel de Guzman
3 
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 #include <string>
8 #include <boost/detail/lightweight_test.hpp>
9 #include <boost/phoenix/core.hpp>
10 #include <boost/phoenix/object.hpp>
11 
12 using std::string;
13 
14 struct T
15 {
fooT16     string foo() { return "T"; }
17 };
18 
19 struct U : T
20 {
fooU21     string foo() { return "U"; }
22 };
23 
24 struct VT
25 {
fooVT26     virtual string foo() { return "T"; }
27 };
28 
29 struct VU : VT
30 {
fooVU31     virtual string foo() { return "U"; }
32 };
33 
34 int
main()35 main()
36 {
37     using boost::phoenix::arg_names::arg1;
38     using boost::phoenix::const_cast_;
39     using boost::phoenix::dynamic_cast_;
40     using boost::phoenix::reinterpret_cast_;
41     using boost::phoenix::static_cast_;
42 
43     {
44         U u;
45         BOOST_TEST(arg1(u).foo() == "U");
46         BOOST_TEST(static_cast_<T&>(arg1)(u).foo() == "T");
47     }
48 
49     {
50         U const u = U();
51         BOOST_TEST(const_cast_<U&>(arg1)(u).foo() == "U");
52     }
53 
54     {
55         VU u;
56         VT* tp = &u;
57         BOOST_TEST(arg1(tp)->foo() == "U");
58         BOOST_TEST(dynamic_cast_<VU*>(arg1)(tp) != 0);
59     }
60 
61     {
62         void* p = 0;
63         reinterpret_cast_<VU*>(arg1)(p); // compile test only
64     }
65 
66     return boost::report_errors();
67 }
68