|
|
@@ -10,6 +10,19 @@ namespace mp { |
|
|
|
{ |
|
|
|
template<typename...> |
|
|
|
struct is_valid_impl; |
|
|
|
|
|
|
|
template<bool...> |
|
|
|
struct bool_pack; |
|
|
|
|
|
|
|
template<typename T, template <typename...> class T_template> |
|
|
|
struct is_specialization_of_impl |
|
|
|
: c_false_t |
|
|
|
{ }; |
|
|
|
|
|
|
|
template<template <typename...> class T_template, typename... Ts> |
|
|
|
struct is_specialization_of_impl<T_template<Ts...>, T_template> |
|
|
|
: c_true_t |
|
|
|
{ }; |
|
|
|
} |
|
|
|
|
|
|
|
template<typename T, typename S> |
|
|
@@ -45,6 +58,12 @@ namespace mp { |
|
|
|
template<typename T> |
|
|
|
using is_unsigned = c_bool_t<std::is_unsigned<T>::value>; |
|
|
|
|
|
|
|
template<typename T, template <typename...> class T_template> |
|
|
|
using is_specialization_of = __impl::is_specialization_of_impl<T, T_template>; |
|
|
|
|
|
|
|
template<bool... B> |
|
|
|
using all_true = c_bool_t<std::is_same<__impl::bool_pack<true, B...>, __impl::bool_pack<B..., true>>::value>; |
|
|
|
|
|
|
|
namespace __impl /* implementation */ |
|
|
|
{ |
|
|
|
template<typename...> |
|
|
|