| /* |
| * 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... > |
| 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...>; |
| }; |
| |
| 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; |
| }; |
| |
| template< template<typename...> class |
| , typename... |
| > |
| struct rewrap; |
| |
| template< template<typename...> class Container |
| , 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...> { |
| using type = typename append<TypeList<Container<Elems...>>, typename rewrap<Container, Elements...>::type>::type; |
| }; |
| |
| template< template<typename...> class...Containers > |
| struct combine { |
| template< typename...Types > |
| struct with_types { |
| template< template <typename...> class Final > |
| struct into { |
| using type = typename append<Final<>, typename rewrap<Containers, Types...>::type...>::type; |
| }; |
| }; |
| }; |
| |
| template<typename T> |
| struct always_false : std::false_type {}; |
| |
| } // namespace Catch |
| |
| #endif // TWOBLUECUBES_CATCH_META_HPP_INCLUDED |