// Copyright 2018 The Fuchsia Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include #include #include namespace { namespace test_void_t { static_assert(std::is_same, void>::value, ""); static_assert(std::is_same, void>::value, ""); static_assert(std::is_same, void>::value, ""); } // namespace test_void_t namespace test_callables { template void invoke_with_defaults(Callable c, fit::parameter_pack) { c(Args()...); } template void invoke_with_defaults(Callable c) { invoke_with_defaults(std::move(c), typename fit::callable_traits::args{}); } bool arg_capture() { BEGIN_TEST; int i = 0; invoke_with_defaults([&] { i = 42; }); EXPECT_EQ(42, i); invoke_with_defaults([&](int, float) { i = 54; }); EXPECT_EQ(54, i); END_TEST; } // Performs static assertions against a function-like type of signature int(float, bool). template struct CallableTraitsTest { using Traits = fit::callable_traits; static_assert(std::is_same_v, ""); static_assert(std::is_same_v, ""); static_assert(2 == Traits::args::size, ""); static_assert(std::is_same_v>, ""); static_assert(std::is_same_v>, ""); }; // compile-time test namespace signature_traits { using Traits = CallableTraitsTest::Traits; } // namespace signature_traits // compile-time test namespace function_pointer_traits { using Traits = CallableTraitsTest::Traits; static_assert(std::is_same_v, ""); } // namespace function_pointer_traits // compile-time test namespace member_function_pointer_traits { struct Object { int method(float, bool); }; using Traits = CallableTraitsTest::Traits; static_assert(std::is_same_v, ""); } // namespace member_function_pointer_traits // compile-time test namespace lambda_traits { auto lambda = [](float, bool) { return 0; }; using Traits = CallableTraitsTest::Traits; } // namespace lambda_traits template struct FunctorTraitsTest { using Traits = typename CallableTraitsTest::Traits; static_assert(std::is_same_v, ""); }; // compile-time test namespace mutable_functor_traits { struct MutableFunctor { int operator()(float, bool) { return 0; } }; using Traits = FunctorTraitsTest::Traits; } //namespace mutable_functor_traits // compile-time test namespace fit_callable_traits { using Traits = FunctorTraitsTest>; } // namespace fit_callable_traits // compile-time test namespace std_callable_traits { using Traits = FunctorTraitsTest>; } // namespace std_callable_traits static_assert(!fit::is_callable::value, ""); static_assert(!fit::is_callable::value, ""); static_assert(!fit::is_callable::value, ""); static_assert(fit::is_callable::value, ""); static_assert(fit::is_callable::value, ""); static_assert(fit::is_callable::value, ""); static_assert(fit::is_callable::value, ""); static_assert(fit::is_callable>::value, ""); static_assert(fit::is_callable>::value, ""); } // namespace test_callables } // namespace BEGIN_TEST_CASE(traits_test) RUN_TEST(test_callables::arg_capture) // suppress -Wunneeded-internal-declaration (void)test_callables::lambda_traits::lambda; END_TEST_CASE(traits_test)