reference_returns.cpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright (C) 2016-2018 T. Zachary Laine
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See
  4. // accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #include <boost/yap/expression.hpp>
  7. #include <boost/mpl/assert.hpp>
  8. #include <boost/test/minimal.hpp>
  9. template<typename T>
  10. using term = boost::yap::terminal<boost::yap::expression, T>;
  11. namespace yap = boost::yap;
  12. namespace reference_returning {
  13. struct number
  14. {
  15. double value;
  16. };
  17. number a_result{3.0};
  18. number const the_result{13.0};
  19. number const & operator+(number a, number b) { return the_result; }
  20. number & operator-(number a, number b) { return a_result; }
  21. }
  22. int test_main(int, char * [])
  23. {
  24. {
  25. term<reference_returning::number> unity = {{1.0}};
  26. auto plus_expr = unity + reference_returning::number{1.0};
  27. {
  28. reference_returning::number const & n = evaluate(plus_expr);
  29. BOOST_CHECK(&n == &reference_returning::the_result);
  30. }
  31. using plus_eval_type = decltype(evaluate(plus_expr));
  32. BOOST_MPL_ASSERT((std::is_same<
  33. plus_eval_type,
  34. reference_returning::number const &>));
  35. auto minus_expr = unity - reference_returning::number{1.0};
  36. {
  37. reference_returning::number & n = evaluate(minus_expr);
  38. BOOST_CHECK(&n == &reference_returning::a_result);
  39. }
  40. using minus_eval_type = decltype(evaluate(minus_expr));
  41. BOOST_MPL_ASSERT((std::is_same<
  42. minus_eval_type,
  43. reference_returning::number &>));
  44. using namespace yap::literals;
  45. {
  46. reference_returning::number & n =
  47. evaluate(1_p, reference_returning::a_result);
  48. BOOST_CHECK(&n == &reference_returning::a_result);
  49. }
  50. using a_eval_type = decltype(evaluate(1_p, reference_returning::a_result));
  51. BOOST_MPL_ASSERT(
  52. (std::is_same<
  53. a_eval_type,
  54. reference_returning::number &>));
  55. {
  56. reference_returning::number const & n =
  57. evaluate(1_p, reference_returning::the_result);
  58. BOOST_CHECK(&n == &reference_returning::the_result);
  59. }
  60. using the_eval_type = decltype(evaluate(1_p, reference_returning::the_result));
  61. BOOST_MPL_ASSERT(
  62. (std::is_same<
  63. the_eval_type,
  64. reference_returning::number const &>));
  65. }
  66. return 0;
  67. }