From ee4ce45b36061964eec1602c7bd3692fb9a40a2f Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Thu, 4 Apr 2024 00:29:55 +0200 Subject: Start implementing Span --- deimos/core/std.h | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'deimos/core/std.h') diff --git a/deimos/core/std.h b/deimos/core/std.h index 601bfb9..c789d95 100644 --- a/deimos/core/std.h +++ b/deimos/core/std.h @@ -23,11 +23,28 @@ template constexpr bool _is_same_helper = false; template constexpr bool _is_same_helper = true; template concept same_as = _is_same_helper && _is_same_helper; +template struct make_void { using type = void; }; +template using void_t = make_void::type; + +template struct _add_reference_helper { using lvalue = T; using rvalue = T; }; +template struct _add_reference_helper> { using lvalue = T&; using rvalue = T&&; }; +template using add_lvalue_reference_t = _add_reference_helper::lvalue; +template using add_rvalue_reference_t = _add_reference_helper::rvalue; + template struct remove_reference { using type = T; }; template struct remove_reference { using type = T; }; template struct remove_reference { using type = T; }; template using remove_reference_t = remove_reference::type; +template +consteval add_rvalue_reference_t declval() +{ + static_assert(false, "Don't use declval outside of constant evaluation"); +} + +template +concept convertible_to = __is_convertible(From, To) && requires { static_cast(declval()); }; + template constexpr remove_reference_t&& move(T&& r) noexcept { @@ -66,6 +83,19 @@ static_assert(std::same_as, int>, ""); static_assert(std::same_as, int>, ""); static_assert(std::same_as, int>, ""); +static_assert(std::same_as, int&>, ""); +static_assert(std::same_as, int&>, ""); +static_assert(std::same_as, int&>, ""); +static_assert(std::same_as, void>, ""); + +static_assert(std::same_as, int&&>, ""); +static_assert(std::same_as, int&>, ""); +static_assert(std::same_as, int&&>, ""); +static_assert(std::same_as, void>, ""); + +static_assert(std::convertible_to, ""); +static_assert(!std::convertible_to, ""); + constexpr void* operator new(size_t, void* ptr) { return ptr; -- cgit