mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Namespace our type traits in catch_meta
Previously they could conflict with user-defined type traits that were in the global namespace. Fixes #1548
This commit is contained in:
		| @@ -11,65 +11,59 @@ | ||||
|  | ||||
| #include <type_traits> | ||||
|  | ||||
| namespace Catch { | ||||
| template< typename... > | ||||
| struct TypeList{}; | ||||
| struct TypeList {}; | ||||
|  | ||||
| template< typename... > | ||||
| struct append; | ||||
|  | ||||
| template< template<typename...> class L1 | ||||
| 	, typename...E1 | ||||
| 	, template<typename...> class L2 | ||||
| 	, typename...E2 | ||||
| 	> | ||||
| struct append< L1<E1...>, L2<E2...> > | ||||
| { | ||||
| 	using type = L1<E1..., E2...>; | ||||
|     , typename...E1 | ||||
|     , template<typename...> class L2 | ||||
|     , typename...E2 | ||||
| > | ||||
| struct append< L1<E1...>, L2<E2...> > { | ||||
|     using type = L1<E1..., E2...>; | ||||
| }; | ||||
|  | ||||
| template< template<typename...> class L1 | ||||
| 	, typename...E1 | ||||
| 	, template<typename...> class L2 | ||||
| 	, typename...E2 | ||||
| 	, typename...Rest | ||||
| 	> | ||||
| struct append< L1<E1...>, L2<E2...>, Rest...> | ||||
| { | ||||
| 	using type = typename append< L1<E1..., E2...>, Rest... >::type; | ||||
|     , typename...E1 | ||||
|     , template<typename...> class L2 | ||||
|     , typename...E2 | ||||
|     , typename...Rest | ||||
| > | ||||
| struct append< L1<E1...>, L2<E2...>, Rest...> { | ||||
|     using type = typename append< L1<E1..., E2...>, Rest... >::type; | ||||
| }; | ||||
|  | ||||
| template< template<typename...> class | ||||
|         , typename... | ||||
|         > | ||||
|     , typename... | ||||
| > | ||||
| struct rewrap; | ||||
|  | ||||
| template< template<typename...> class Container | ||||
|         , template<typename...> class List | ||||
|         , typename...elems | ||||
|         > | ||||
| struct rewrap<Container, List<elems...>> | ||||
| { | ||||
|     , template<typename...> class List | ||||
|     , typename...elems | ||||
| > | ||||
| struct rewrap<Container, List<elems...>> { | ||||
|     using type = TypeList< Container< elems... > >; | ||||
| }; | ||||
|  | ||||
| template< template<typename...> class Container | ||||
|         , template<typename...> class List | ||||
|         , class...Elems | ||||
|         , typename...Elements> | ||||
| struct rewrap<Container, List<Elems...>, Elements...> | ||||
| { | ||||
|     , template<typename...> class List | ||||
|     , class...Elems | ||||
|     , typename...Elements> | ||||
|     struct rewrap<Container, List<Elems...>, Elements...> { | ||||
|     using type = typename append<TypeList<Container<Elems...>>, typename rewrap<Container, Elements...>::type>::type; | ||||
| }; | ||||
|  | ||||
| template< template<typename...> class...Containers > | ||||
| struct combine | ||||
| { | ||||
| struct combine { | ||||
|     template< typename...Types > | ||||
|     struct with_types | ||||
|     { | ||||
|     struct with_types { | ||||
|         template< template <typename...> class Final > | ||||
|         struct into | ||||
|         { | ||||
|         struct into { | ||||
|             using type = typename append<Final<>, typename rewrap<Containers, Types...>::type...>::type; | ||||
|         }; | ||||
|     }; | ||||
| @@ -78,4 +72,6 @@ struct combine | ||||
| template<typename T> | ||||
| struct always_false : std::false_type {}; | ||||
|  | ||||
| } // namespace Catch | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_META_HPP_INCLUDED | ||||
|   | ||||
| @@ -81,7 +81,7 @@ | ||||
| #define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME(Name, ...) INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME1(Name, INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))) | ||||
| #endif | ||||
|  | ||||
| #define INTERNAL_CATCH_MAKE_TYPE_LIST(types) TypeList<INTERNAL_CATCH_REMOVE_PARENS(types)> | ||||
| #define INTERNAL_CATCH_MAKE_TYPE_LIST(types) Catch::TypeList<INTERNAL_CATCH_REMOVE_PARENS(types)> | ||||
|  | ||||
| #define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(types)\ | ||||
|     CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,INTERNAL_CATCH_REMOVE_PARENS(types)) | ||||
|   | ||||
| @@ -168,7 +168,7 @@ struct AutoReg : NonCopyable { | ||||
|                 }                                                     \ | ||||
|             };                                                        \ | ||||
|             static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ | ||||
|                 using TestInit = combine<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)> \ | ||||
|                 using TestInit = Catch::combine<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)> \ | ||||
|                             ::with_types<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(TypesList)>::into<TestName>::type; \ | ||||
|                 TestInit();                                           \ | ||||
|                 return 0;                                             \ | ||||
| @@ -236,7 +236,7 @@ struct AutoReg : NonCopyable { | ||||
|                 }\ | ||||
|             };\ | ||||
|             static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ | ||||
|                 using TestInit = combine<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>\ | ||||
|                 using TestInit = Catch::combine<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>\ | ||||
|                             ::with_types<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(TypesList)>::into<TestNameClass>::type;\ | ||||
|                 TestInit();\ | ||||
|                 return 0;\ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský