diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2024-03-29 00:18:28 +0100 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2024-03-29 00:18:57 +0100 |
commit | 3c0d80179c0f2053fb2b892ee9af47200cb5d539 (patch) | |
tree | 8b0598e344e6d97c1c1492af8e25ac36bccdb3f7 /deimos/core/std.h | |
parent | b70ed765ff6cf51aff20714e3ec4415b06898059 (diff) |
Separate the std-lite stuff
Diffstat (limited to 'deimos/core/std.h')
-rw-r--r-- | deimos/core/std.h | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/deimos/core/std.h b/deimos/core/std.h new file mode 100644 index 0000000..1c611cd --- /dev/null +++ b/deimos/core/std.h @@ -0,0 +1,49 @@ +#pragma once
+
+namespace std
+{
+
+template<typename U, typename V> constexpr bool _is_same_helper = false;
+template<typename T> constexpr bool _is_same_helper<T, T> = true;
+template<typename U, typename V> concept same_as = _is_same_helper<U, V> && _is_same_helper<V, U>;
+
+template<typename T> struct remove_reference { using type = T; };
+template<typename T> struct remove_reference<T&> { using type = T; };
+template<typename T> struct remove_reference<T&&> { using type = T; };
+template<typename T> using remove_reference_t = remove_reference<T>::type;
+
+template<typename T>
+constexpr remove_reference_t<T>&& move(T&& r) noexcept
+{
+ return static_cast<remove_reference_t<T>&&>(r);
+}
+
+template<typename T>
+constexpr T&& forward(remove_reference_t<T>& r) noexcept
+{
+ return static_cast<T&&>(r);
+}
+
+template<typename T>
+constexpr T&& forward(remove_reference_t<T>&& r) noexcept // NOLINT
+{
+ return static_cast<T&&>(r);
+}
+
+template<typename T, typename U>
+constexpr T exchange(T& obj, U&& new_value)
+{
+ T old_value = std::move(obj);
+ obj = std::forward<U>(new_value);
+ return old_value;
+}
+
+} // namespace std
+
+static_assert(std::same_as<int, int>, "");
+static_assert(!std::same_as<int, void>, "");
+
+static_assert(std::same_as<std::remove_reference_t<int>, int>, "");
+static_assert(std::same_as<std::remove_reference_t<int&>, int>, "");
+static_assert(std::same_as<std::remove_reference_t<int&&>, int>, "");
+
|