// 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 { 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::function_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 TraitsTest { using Traits = fit::function_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 = TraitsTest::Traits; } // namespace signature_traits // compile-time test namespace function_pointer_traits { using Traits = TraitsTest::Traits; static_assert(std::is_same_v); } // namespace function_pointer_traits // compile-time test namespace lambda_traits { auto lambda = [](float, bool) { return 0; }; using Traits = TraitsTest::Traits; } // namespace lambda_traits template struct FunctorTraitsTest { using Traits = typename TraitsTest::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_function_traits { using Traits = FunctorTraitsTest>; } // namespace fit_function_traits // compile-time test namespace std_function_traits { using Traits = FunctorTraitsTest>; } // namespace std_function_traits } // namespace BEGIN_TEST_CASE(function_traits_tests) RUN_TEST(arg_capture) // suppress -Wunneeded-internal-declaration (void)lambda_traits::lambda; END_TEST_CASE(function_traits_tests)