Header file meta.hpp

#define SIPLASPLAS_UTILITY_META_H 

#include <type_traits>

#include <cstdint>

namespace cpp
{
    namespace meta
    {
        template <typename B, typename ... Bs>
        struct assert<B, Bs...>;
        
        template <>
        struct assert<>;
        
        template <typename T>
        struct identity;
        
        template <typename MetafunctionClass, template <typename> typename Seq, typename ... Ts>
        struct sequence_apply<MetafunctionClass, Seq<Ts...>;
        
        using true_ = bool_<true>;
        
        using false_ = bool_<false>;
        
        template <typename T, typename = void>
        struct is_integral;
        
        template <typename T>
        struct is_integral<T, void_t<decltype(T::value)>;
        
        template <typename T, typename = assert<is_integral<T>>>
        constexpr decltype(T::value) value();
        
        template <template <typename> typename Function>
        struct defer;
        
        struct and_;
        
        struct or_;
        
        struct add_;
        
        template <typename ... Ts>
        struct list;
        
        template <char ... Chars>
        class StringToArray<list<std::integral_constant<char, Chars>...>;
        
        template <template <typename> typename Seq, typename ... Ts>
        struct functor<Seq<Ts...>;
        
        template <template <typename> typename Seq, typename ... Lhs, typename ... Rhs>
        struct cat<Seq<Lhs...>, Seq<Rhs...>;
        
        namespace detail
        {
            template <template <typename> typename Seq, std::size_t Index, typename ... Left, typename Head, typename ... Tail>
            struct split<Seq<Left...>, Index, Seq<Head, Tail...>;
            
            template <template <typename> typename Seq, typename ... Left, typename Head, typename ... Tail>
            struct split<Seq<Left...>, 0, Seq<Head, Tail...>;
        }
        
        template <std::size_t Index, template <typename> typename Seq, typename ... Ts>
        struct split<Index, Seq<Ts...>;
        
        template <typename T, template <typename> typename Seq, typename ... Ts>
        struct prepend<T, Seq<Ts...>;
        
        template <typename T, template <typename> typename Seq, typename ... Ts>
        struct append<T, Seq<Ts...>;
        
        template <typename Key, typename Value>
        struct pair;
        
        template <typename ... Ts>
        struct inherit;
        
        template <typename ... Ts>
        struct inherit<list<Ts...>;
        
        template <typename ... Keys, typename ... Values>
        struct map<pair<Keys, Values>...>;
        
        template <typename Function, typename ... Ts>
        struct pack_fmap;
        
        template <typename Function, template <typename> typename Seq, typename ... Ts>
        struct fmap<Function, Seq<Ts...>;
        
        namespace detail
        {
            template <typename Predicate, template <typename> typename Seq, typename ... Filtered, typename Head, typename ... Tail>
            struct filter<Predicate, Seq<Filtered...>, Seq<Head, Tail...>;
            
            template <typename Predicate, template <typename> typename Seq, typename ... Filtered>
            struct filter<Predicate, Seq<Filtered...>, Seq<>;
        }
        
        template <typename Function, typename Seed, template <typename> typename Seq, typename Head, typename ... Tail>
        struct foldl<Function, Seed, Seq<Head, Tail...>;
        
        template <typename Function, typename Seed, template <typename> typename Seq>
        struct foldl<Function, Seed, Seq<>;
        
        template <typename Function, typename Seed, template <typename> typename Seq, typename Head, typename ... Tail>
        struct foldr<Function, Seed, Seq<Head, Tail...>;
        
        template <typename Function, typename Seed, template <typename> typename Seq>
        struct foldr<Function, Seed, Seq<>;
        
        namespace detail
        {
            template <template <typename> typename Seq, std::size_t N>
            struct make_index_sequence;
            
            template <template <typename> typename Seq>
            struct make_index_sequence<Seq, 1>;
            
            template <template <typename> typename Seq>
            struct make_index_sequence<Seq, 0>;
        }
        
        template <template <typename> typename Seq, typename ... Ts>
        struct to_index_sequence<Seq<Ts...>;
        
        template <template <typename> typename Zipper, typename ... Seqs>
        struct zip;
        
        template <template <typename> typename Function, typename ... Args>
        struct bind;
    }
}