mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Extract FunctionReturnType to catch_meta.hpp
This commit is contained in:
		| @@ -8,6 +8,7 @@ | ||||
| #define TWOBLUECUBES_CATCH_GENERATORS_GENERIC_HPP_INCLUDED | ||||
|  | ||||
| #include "catch_generators.hpp" | ||||
| #include "catch_meta.hpp" | ||||
|  | ||||
| namespace Catch { | ||||
| namespace Generators { | ||||
| @@ -172,18 +173,7 @@ namespace Generators { | ||||
|         } | ||||
|     }; | ||||
|  | ||||
| #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 MapFunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U>>>; | ||||
| #else | ||||
|     template <typename Func, typename U> | ||||
|     using MapFunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U)>::type>::type>::type; | ||||
| #endif | ||||
|  | ||||
|     template <typename Func, typename U, typename T = MapFunctionReturnType<Func, U>> | ||||
|     template <typename Func, typename U, typename T = FunctionReturnType<Func, U>> | ||||
|     GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) { | ||||
|         return GeneratorWrapper<T>( | ||||
|             pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator)) | ||||
|   | ||||
| @@ -12,22 +12,34 @@ | ||||
| #include <type_traits> | ||||
|  | ||||
| namespace Catch { | ||||
| template<typename T> | ||||
| struct always_false : std::false_type {}; | ||||
|     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> 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(...); | ||||
| }; | ||||
|     struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {}; | ||||
|  | ||||
| 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 | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský