#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; constexpr bool operator==(const uint128& other) const = default; }; struct SourceLocation { const char* file; int32 line; constexpr SourceLocation( // NOLINT const char* file_ = __builtin_FILE(), int32 line_ = __builtin_LINE()) : file{file_}, line{line_} {} }; template struct RemoveReferenceT { using Type = T; }; template struct RemoveReferenceT { using Type = T; }; template struct RemoveReferenceT { using Type = T; }; template using RemoveReference = RemoveReferenceT::Type; template constexpr bool kIsTriviallyDestructible = __is_trivially_destructible(T); } // namespace deimos constexpr void* operator new(deimos::uint64, void* ptr) { return ptr; } namespace std { template constexpr deimos::RemoveReference&& move(T&& t) noexcept { return static_cast&&>(t); } template constexpr T&& forward(deimos::RemoveReference& t) noexcept { return static_cast(t); } template constexpr T&& forward(deimos::RemoveReference&& t) noexcept // NOLINT { return static_cast(t); } template constexpr T exchange(T& obj, U&& new_value) { T old_value = std::move(obj); obj = std::forward(new_value); return old_value; } } // namespace std