summaryrefslogtreecommitdiff
path: root/deimos/core/base.h
diff options
context:
space:
mode:
Diffstat (limited to 'deimos/core/base.h')
-rw-r--r--deimos/core/base.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/deimos/core/base.h b/deimos/core/base.h
new file mode 100644
index 0000000..0530db7
--- /dev/null
+++ b/deimos/core/base.h
@@ -0,0 +1,87 @@
+#pragma once
+
+#define deimos_StaticAssert(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
+
+#define deimos_NO_COPY(TYPE) \
+ TYPE(const TYPE&) = delete; \
+ TYPE& operator=(const TYPE&) = delete;
+
+#define deimos_NO_MOVE(TYPE) \
+ TYPE(TYPE&&) = delete; \
+ TYPE& operator=(TYPE&&) = delete;
+
+#define deimos_NO_COPY_MOVE(TYPE) \
+ deimos_NO_COPY(TYPE); \
+ deimos_NO_MOVE(TYPE);
+
+#define deimos_DEFAULT_COPY(TYPE) \
+ TYPE(const TYPE&) = default; \
+ TYPE& operator=(const TYPE&) = default;
+
+#define deimos_DEFAULT_MOVE(TYPE) \
+ TYPE(TYPE&&) = default; \
+ TYPE& operator=(TYPE&&) = default;
+
+#define deimos_DEFAULT_COPY_MOVE(TYPE) \
+ deimos_DEFAULT_COPY(TYPE); \
+ deimos_DEFAULT_MOVE(TYPE);
+
+namespace deimos
+{
+
+using uint8 = unsigned char;
+using uint16 = unsigned short;
+using uint32 = unsigned int;
+using uint64 = unsigned long long;
+
+using int8 = char;
+using int16 = short;
+using int32 = int;
+using int64 = long long;
+
+using float32 = float;
+using float64 = double;
+
+struct uint128
+{
+ uint64 high;
+ uint64 low;
+};
+
+template<typename T> struct RemoveReferenceT { using Type = T; };
+template<typename T> struct RemoveReferenceT<T&> { using Type = T; };
+template<typename T> struct RemoveReferenceT<T&&> { using Type = T; };
+template<typename T> using RemoveReference = RemoveReferenceT<T>::Type;
+
+template<typename T> constexpr bool kIsTriviallyDestructible = __is_trivially_destructible(T);
+
+} // namespace deimos
+
+constexpr void* operator new(deimos::uint64, void* ptr)
+{
+ return ptr;
+}
+
+namespace std
+{
+
+template<typename T>
+constexpr deimos::RemoveReference<T>&& move(T&& t) noexcept
+{
+ return static_cast<deimos::RemoveReference<T>&&>(t);
+}
+
+template<typename T>
+constexpr T&& forward(deimos::RemoveReference<T>& t) noexcept
+{
+ return static_cast<T&&>(t);
+}
+
+template<typename T>
+constexpr T&& forward(deimos::RemoveReference<T>&& t) noexcept // NOLINT
+{
+ return static_cast<T&&>(t);
+}
+
+} // namespace std
+