summaryrefslogtreecommitdiff
path: root/deimos/core/std.h
diff options
context:
space:
mode:
Diffstat (limited to 'deimos/core/std.h')
-rw-r--r--deimos/core/std.h49
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>, "");
+