returns.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /*=============================================================================
  2. Copyright (c) 2017 Paul Fultz II
  3. returns.cpp
  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 <boost/hof/returns.hpp>
  8. #include "test.hpp"
  9. #if !defined (__GNUC__) || defined (__clang__)
  10. struct add_1
  11. {
  12. int a;
  13. add_1() : a(1) {}
  14. BOOST_HOF_RETURNS_CLASS(add_1);
  15. template<class T>
  16. auto operator()(T x) const
  17. BOOST_HOF_RETURNS(x+BOOST_HOF_CONST_THIS->a);
  18. };
  19. BOOST_HOF_TEST_CASE()
  20. {
  21. BOOST_HOF_TEST_CHECK(3 == add_1()(2));
  22. }
  23. #endif
  24. // TODO: check noexcept
  25. struct id
  26. {
  27. template<class T>
  28. constexpr auto operator()(T x) const BOOST_HOF_RETURNS
  29. (x);
  30. };
  31. BOOST_HOF_TEST_CASE()
  32. {
  33. BOOST_HOF_TEST_CHECK(id{}(3) == 3);
  34. BOOST_HOF_STATIC_TEST_CHECK(id{}(3) == 3);
  35. }
  36. struct void_ {};
  37. constexpr void_ no_op() { return void_{}; }
  38. struct id_comma
  39. {
  40. template<class T>
  41. constexpr auto operator()(T&& x) const BOOST_HOF_RETURNS
  42. (no_op(), boost::hof::forward<T>(x));
  43. };
  44. BOOST_HOF_TEST_CASE()
  45. {
  46. BOOST_HOF_TEST_CHECK(id_comma{}(3) == 3);
  47. BOOST_HOF_STATIC_TEST_CHECK(id_comma{}(3) == 3);
  48. }