function.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*=============================================================================
  2. Copyright (c) 2017 Paul Fultz II
  3. function.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/function.hpp>
  8. #include <boost/hof/partial.hpp>
  9. #include <boost/hof/infix.hpp>
  10. #include <memory>
  11. #include "test.hpp"
  12. namespace test_constexpr {
  13. struct sum_f
  14. {
  15. template<class T, class U>
  16. constexpr T operator()(T x, U y) const
  17. {
  18. return x+y;
  19. }
  20. };
  21. BOOST_HOF_STATIC_FUNCTION(sum_init) = sum_f();
  22. BOOST_HOF_TEST_CASE()
  23. {
  24. // TODO: Should be empty on MSVC as well
  25. #ifndef _MSC_VER
  26. STATIC_ASSERT_EMPTY(sum_init);
  27. #endif
  28. BOOST_HOF_TEST_CHECK(3 == sum_init(1, 2));
  29. BOOST_HOF_STATIC_TEST_CHECK(3 == sum_init(1, 2));
  30. }
  31. BOOST_HOF_STATIC_FUNCTION(sum_partial) = boost::hof::partial(sum_f());
  32. BOOST_HOF_TEST_CASE()
  33. {
  34. #ifndef _MSC_VER
  35. STATIC_ASSERT_EMPTY(sum_partial);
  36. #endif
  37. BOOST_HOF_TEST_CHECK(3 == sum_partial(1, 2));
  38. BOOST_HOF_TEST_CHECK(3 == sum_partial(1)(2));
  39. BOOST_HOF_STATIC_TEST_CHECK(3 == sum_partial(1, 2));
  40. BOOST_HOF_STATIC_TEST_CHECK(3 == sum_partial(1)(2));
  41. }
  42. }
  43. namespace test_static {
  44. struct sum_f
  45. {
  46. template<class T, class U>
  47. constexpr T operator()(T x, U y) const
  48. {
  49. return x+y;
  50. }
  51. };
  52. struct add_one_f
  53. {
  54. template<class T>
  55. constexpr T operator()(T x) const
  56. {
  57. return x+1;
  58. }
  59. };
  60. BOOST_HOF_STATIC_FUNCTION(sum_partial) = boost::hof::partial(sum_f());
  61. BOOST_HOF_TEST_CASE()
  62. {
  63. #ifndef _MSC_VER
  64. STATIC_ASSERT_EMPTY(sum_partial);
  65. #endif
  66. BOOST_HOF_TEST_CHECK(3 == sum_partial(1, 2));
  67. BOOST_HOF_TEST_CHECK(3 == sum_partial(1)(2));
  68. }
  69. BOOST_HOF_STATIC_FUNCTION(add_one_pipable) = boost::hof::pipable(add_one_f());
  70. BOOST_HOF_TEST_CASE()
  71. {
  72. // TODO: Make this work on msvc
  73. #ifndef _MSC_VER
  74. STATIC_ASSERT_EMPTY(add_one_pipable);
  75. #endif
  76. BOOST_HOF_TEST_CHECK(3 == add_one_pipable(2));
  77. BOOST_HOF_TEST_CHECK(3 == (2 | add_one_pipable));
  78. }
  79. BOOST_HOF_STATIC_FUNCTION(sum_infix) = boost::hof::infix(sum_f());
  80. BOOST_HOF_TEST_CASE()
  81. {
  82. // TODO: Make this work on msvc
  83. #ifndef _MSC_VER
  84. STATIC_ASSERT_EMPTY(sum_infix);
  85. #endif
  86. BOOST_HOF_TEST_CHECK(3 == (1 <sum_infix> 2));
  87. }
  88. }