/* Copyright Barrett Adair 2016-2021 Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http ://boost.org/LICENSE_1_0.txt) */ #include #include #include #include #include "test.hpp" #ifdef BOOST_CLBL_TRTS_GCC_OLDER_THAN_4_9_2 //gcc < 4.9 doesn't like the invoke_case pattern used here int main(){} #else template struct tag { using type = T; }; template struct invoke_case { template void operator()(tag) const { CT_ASSERT((Expect == boost::callable_traits::is_invocable())); #ifndef BOOST_CLBL_TRTS_DISABLE_VARIABLE_TEMPLATES CT_ASSERT((Expect == boost::callable_traits::is_invocable_v)); #endif // when available, test parity with std implementation #if defined(__cpp_lib_is_invocable) CT_ASSERT((std::is_invocable() == boost::callable_traits::is_invocable())); # ifndef BOOST_CLBL_TRTS_DISABLE_VARIABLE_TEMPLATES CT_ASSERT((std::is_invocable_v == boost::callable_traits::is_invocable_v)); # endif #endif } }; template void run_tests() { using ignored = int[]; ignored x {(InvokeCases{}(tag{}),0)..., 0}; (void)x; } struct foo {}; int main() { run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); // old MSVC doesn't handle cv + ref qualifiers in expression sfinae correctly #ifndef BOOST_CLBL_TRTS_OLD_MSVC #if __cplusplus <= 201703L #define QUIRKY_CASE true #else #define QUIRKY_CASE false #endif run_tests ,invoke_case ,invoke_case ,invoke_case #endif ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); #endif // #ifndef BOOST_CLBL_TRTS_OLD_MSVC run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); auto f = [](int){}; run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); auto g = [](){}; run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); // libc++ requires constructible types be passed to std::is_invocable #ifndef _LIBCPP_VERSION run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); #endif run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); } #endif //#ifdef BOOST_CLBL_TRTS_GCC_OLDER_THAN_4_9_2