|
- #pragma once
-
- #include "checker.h"
-
- namespace cppmp
- {
-
- namespace __impl
- {
-
- /* bool_pack */
-
- template<bool...>
- struct bool_pack;
-
- /* is_specialization_of_impl */
-
- template<typename T, template <typename...> class T_template>
- struct is_specialization_of_impl
- : public false_t
- { };
-
- template<template <typename...> class T_template, typename... Ts>
- struct is_specialization_of_impl<T_template<Ts...>, T_template>
- : public true_t
- { };
-
- /* is_valid */
-
- template<typename T, std::size_t = sizeof(T)>
- std::true_type is_valid_impl(T *);
-
- std::false_type is_valid_impl(...);
-
- template<typename T>
- struct is_valid
- : public decltype(is_valid_impl(std::declval<T*>()))
- { };
-
- template<>
- struct is_valid<void>
- : public true_t
- { };
-
- }
-
- /* is_specialization_of */
-
- template<typename T, template <typename...> class T_template>
- struct is_specialization_of
- : public __impl::is_specialization_of_impl<T, T_template>
- { };
-
- /* is_true */
-
- template<bool... B>
- struct is_true
- : public is_same<__impl::bool_pack<true, B...>, __impl::bool_pack<B..., true>>
- { };
-
- }
|