#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_TEMPLATE_UTIL_H_
#define MOJO_PUBLIC_CPP_BINDINGS_LIB_TEMPLATE_UTIL_H_
#include <optional>
#include <type_traits>
#include "mojo/public/cpp/bindings/optional_as_pointer.h"
namespace mojo::internal {
template <typename T>
struct IsMoveOnlyType {
static const bool value =
std::is_constructible_v<T, T&&> && !std::is_constructible_v<T, const T&>;
};
template <template <typename...> class Template, typename T>
struct IsSpecializationOf : std::false_type {};
template <template <typename...> class Template, typename... Args>
struct IsSpecializationOf<Template, Template<Args...>> : std::true_type {};
template <typename T>
using IsStdOptional = IsSpecializationOf<std::optional, std::decay_t<T>>;
template <typename T>
using IsOptionalAsPointer =
IsSpecializationOf<mojo::OptionalAsPointer, std::decay_t<T>>;
}
#endif