1 /*=============================================================================
2     Copyright (c) 2005-2007 Dan Marsden
3     Copyright (c) 2005-2007 Joel de Guzman
4     Copyright (c) 2014      John Fletcher
5 
6     Distributed under the Boost Software License, Version 1.0. (See accompanying
7     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 ==============================================================================*/
9 
10 #include <boost/phoenix/core.hpp>
11 #include <boost/phoenix/operator.hpp>
12 #include <boost/detail/lightweight_test.hpp>
13 //#include <boost/move/unique_ptr.hpp>
14 
15 #include <memory>
16 
17 #include <boost/shared_ptr.hpp>
18 #include <boost/scoped_ptr.hpp>
19 
20 namespace
21 {
22     struct Test
23     {
24         int value;
25 
func__anonfaef17010111::Test26         int func(int n) const { return n; }
dunc__anonfaef17010111::Test27         int dunc() { return 10; }
kunc__anonfaef17010111::Test28         int kunc() const { return 555; }
29     };
30 }
31 
32 namespace phoenix = boost::phoenix;
33 
main()34 int main()
35 {
36     using boost::scoped_ptr;
37     using boost::shared_ptr;
38     using phoenix::val;
39     using phoenix::ref;
40     using phoenix::arg_names::arg1;
41     using phoenix::arg_names::arg2;
42 
43     Test test = {1};
44     const Test* cptr = &test;
45     Test* ptr = &test;
46 
47     BOOST_TEST((val(ptr)->*&Test::value)() == 1);
48     BOOST_TEST((val(cptr)->*&Test::value)() == 1);
49     BOOST_TEST((arg1->*&Test::value)(cptr) == 1);
50 
51     ((val(ptr)->*&Test::value) = 2)();
52     BOOST_TEST(test.value == 2);
53 
54 
55     BOOST_TEST((val(ptr)->*&Test::func)(val(3))() == 3);
56     int i = 33;
57     BOOST_TEST((arg1->*&Test::func)(arg2)(cptr, i) == i);
58     //BOOST_TEST((val(cptr)->*&Test::func)(4)() == 4);
59     BOOST_TEST((val(ptr)->*&Test::dunc)()() == 10);
60 
61     BOOST_TEST((arg1->*&Test::func)(5)(ptr) == 5);
62     BOOST_TEST((arg1->*&Test::kunc)()(ptr));
63 
64     shared_ptr<Test> sptr(new Test(test));
65 
66     BOOST_TEST((arg1->*&Test::value)(sptr) == 2);
67     BOOST_TEST((arg1->*&Test::func)(6)(sptr) == 6);
68 
69     scoped_ptr<Test> scptr(new Test(test));
70 
71     BOOST_TEST((arg1->*&Test::value)(scptr) == 2);
72     BOOST_TEST((arg1->*&Test::func)(7)(scptr) == 7);
73 
74     shared_ptr<const Test> csptr(new Test(test));
75 
76     BOOST_TEST((arg1->*&Test::value)(csptr) == 2);
77     BOOST_TEST((arg1->*&Test::func)(8)(csptr) == 8);
78 
79     scoped_ptr<const Test> cscptr(new Test(test));
80 
81     BOOST_TEST((arg1->*&Test::value)(cscptr) == 2);
82     BOOST_TEST((arg1->*&Test::func)(9)(cscptr) == 9);
83 
84 #ifdef BOOST_NO_CXX11_SMART_PTR
85     std::auto_ptr<Test> aptr(new Test(test));
86 #else
87     std::unique_ptr<Test> aptr(new Test(test));
88 #endif
89 
90     BOOST_TEST((arg1->*&Test::value)(aptr) == 2);
91     BOOST_TEST((arg1->*&Test::func)(10)(aptr) == 10);
92 
93 #ifdef BOOST_NO_CXX11_SMART_PTR
94     std::auto_ptr<const Test> captr(new Test(test));
95 #else
96     std::unique_ptr<const Test> captr(new Test(test));
97 #endif
98 
99     BOOST_TEST((arg1->*&Test::value)(captr) == 2);
100     BOOST_TEST((arg1->*&Test::func)(11)(captr) == 11);
101 
102     //boost::movelib::unique_ptr<Test> buptr(new Test(test));
103     //BOOST_TEST((arg1->*&Test::value)(buptr) == 2);
104     //BOOST_TEST((arg1->*&Test::func)(12)(buptr) == 12);
105 
106 
107     return boost::report_errors();
108 }
109