member.cpp 3.0 KB

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