| /* |
| * Created by Jozef on 02/12/2018. |
| * Copyright 2018 Two Blue Cubes Ltd. All rights reserved. |
| * |
| * Distributed under the Boost Software License, Version 1.0. (See accompanying |
| * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| */ |
| |
| #ifndef TWOBLUECUBES_CATCH_META_HPP_INCLUDED |
| #define TWOBLUECUBES_CATCH_META_HPP_INCLUDED |
| |
| #include <type_traits> |
| |
| namespace Catch { |
| template<typename T> |
| struct always_false : std::false_type {}; |
| |
| template <typename> struct true_given : std::true_type {}; |
| struct is_callable_tester { |
| template <typename Fun, typename... Args> |
| true_given<decltype(std::declval<Fun>()(std::declval<Args>()...))> static test(int); |
| template <typename...> |
| std::false_type static test(...); |
| }; |
| |
| template <typename T> |
| struct is_callable; |
| |
| template <typename Fun, typename... Args> |
| struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {}; |
| |
| |
| #if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703 |
| // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is |
| // replaced with std::invoke_result here. Also *_t format is preferred over |
| // typename *::type format. |
| template <typename Func, typename U> |
| using FunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U>>>; |
| #else |
| template <typename Func, typename U> |
| using FunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U)>::type>::type>::type; |
| #endif |
| |
| } // namespace Catch |
| |
| namespace mpl_{ |
| struct na; |
| } |
| |
| #endif // TWOBLUECUBES_CATCH_META_HPP_INCLUDED |