#pragma once #include #include #include #include namespace mln { template constexpr auto underlying_type(T t) -> typename std::underlying_type_t { return typename std::underlying_type_t(t); } template struct is_utf16char_like : std::false_type {}; template struct is_utf16char_like : is_utf16char_like {}; template <> struct is_utf16char_like : std::true_type {}; template <> struct is_utf16char_like : std::true_type {}; template <> struct is_utf16char_like : std::true_type {}; template using is_utf16char_like_pointer = std::integral_constant && is_utf16char_like>::value>; template OutPointer utf16char_cast(InChar *in) requires(is_utf16char_like::value && is_utf16char_like_pointer::value) { return reinterpret_cast(in); } template struct is_linear_container : std::false_type {}; template struct is_linear_container> : std::true_type {}; template struct is_linear_container> : std::true_type {}; } // namespace mln