#pragma once #include #include "meta.h" namespace meta { template typename TMPLT> struct is_template : std::false_type { }; template typename TMPLT, typename...Args> struct is_template, TMPLT> : std::true_type { }; template struct index_sequence_cat, std::index_sequence> { using type = std::index_sequence; }; template<> struct index_sequence_rev> { using type = std::index_sequence<>; }; template struct index_sequence_rev> { using type = index_sequence_cat_t, index_sequence_rev_t>>; }; template struct is_iterable : std::false_type {}; template struct is_iterable()) != std::end(std::declval()), // begin/end and operator != void(), // Handle evil operator , ++std::declval()))&>(), // operator ++ void(*std::begin(std::declval())) // operator* )>> : std::true_type {}; template struct is_sequential_container : std::is_array> {}; template struct is_sequential_container().front() )>> : is_iterable {}; template struct is_associative_container : std::false_type {}; template struct is_associative_container().insert(std::declval::value_type>()) )>> : is_iterable {}; template struct is_container : std::disjunction, is_sequential_container> {}; template struct is_macro_enum : std::false_type {}; template struct is_macro_enum::count, std::decay_t::names[0], std::decay_t::values[0] )>> : std::is_enum::_enum> {}; template struct is_variant_member; template struct is_variant_member> : std::disjunction...> {}; // true if is integral/floating point, or is constructible from and to string, or is macro enum template struct is_basic_serializable : std::disjunction< std::is_arithmetic>, is_macro_enum>, std::conjunction, std::is_constructible, string>>> {}; }