#include #include #include #include #include #include "test.hpp" struct sum_f { template constexpr T operator()(T x, U y) const FIT_RETURNS_DEDUCE_NOEXCEPT(x+y) { return x+y; } }; static constexpr fit::infix_adaptor sum = {}; #if FIT_HAS_NOEXCEPT_DEDUCTION FIT_TEST_CASE() { static_assert(noexcept(1 2), "noexcept infix"); static_assert(!noexcept(std::string() std::string()), "noexcept infix"); } #endif FIT_TEST_CASE() { FIT_TEST_CHECK(3 == (1 2)); FIT_STATIC_TEST_CHECK(3 == (1 2)); FIT_TEST_CHECK(3 == (sum(1, 2))); FIT_STATIC_TEST_CHECK(3 == (sum(1, 2))); } FIT_STATIC_FUNCTION(sum1) = fit::infix(sum_f()); FIT_TEST_CASE() { FIT_TEST_CHECK(3 == (1 2)); FIT_STATIC_TEST_CHECK(3 == (1 2)); FIT_TEST_CHECK(3 == (sum1(1, 2))); FIT_STATIC_TEST_CHECK(3 == (sum1(1, 2))); } FIT_STATIC_LAMBDA_FUNCTION(sum2) = fit::infix([](int x, int y) { return x + y; }); FIT_TEST_CASE() { FIT_TEST_CHECK(3 == (1 2)); FIT_TEST_CHECK(3 == (sum2(1, 2))); } FIT_STATIC_FUNCTION(sum3) = fit::infix(fit::_ + fit::_); FIT_TEST_CASE() { FIT_TEST_CHECK(3 == (1 2)); FIT_STATIC_TEST_CHECK(3 == (1 2)); FIT_TEST_CHECK(3 == (sum3(1, 2))); FIT_STATIC_TEST_CHECK(3 == (sum3(1, 2))); } FIT_STATIC_LAMBDA_FUNCTION(sum4) = fit::infix(fit::infix([](int x, int y) { return x + y; })); FIT_TEST_CASE() { FIT_TEST_CHECK(3 == (1 2)); FIT_TEST_CHECK(3 == (sum4(1, 2))); } FIT_STATIC_FUNCTION(sum5) = fit::infix(fit::infix(fit::_ + fit::_)); FIT_TEST_CASE() { FIT_TEST_CHECK(3 == (1 2)); FIT_STATIC_TEST_CHECK(3 == (1 2)); FIT_TEST_CHECK(3 == (sum5(1, 2))); FIT_STATIC_TEST_CHECK(3 == (sum5(1, 2))); } FIT_TEST_CASE() { #if (defined(__GNUC__) && !defined (__clang__)) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wparentheses" #endif FIT_TEST_CHECK(6 == (1 + 2 3)); FIT_TEST_CHECK(3 == 1 2); #if (defined(__GNUC__) && !defined (__clang__)) #pragma GCC diagnostic pop #endif } struct foo {}; FIT_TEST_CASE() { auto f = fit::infix([](int, int) { return foo{}; }); auto g = fit::infix([](foo, foo) { return std::string("hello"); }); FIT_TEST_CHECK((1 2 foo{}) == "hello"); }