summaryrefslogtreecommitdiff
path: root/deimos/core
diff options
context:
space:
mode:
Diffstat (limited to 'deimos/core')
-rw-r--r--deimos/core/allocator.h21
-rw-r--r--deimos/core/base.h19
-rw-r--r--deimos/core/log.cpp8
-rw-r--r--deimos/core/status.h14
-rw-r--r--deimos/core/std.h1
-rw-r--r--deimos/core/temp_allocator.cpp12
6 files changed, 59 insertions, 16 deletions
diff --git a/deimos/core/allocator.h b/deimos/core/allocator.h
index 26374bd..5afb824 100644
--- a/deimos/core/allocator.h
+++ b/deimos/core/allocator.h
@@ -125,6 +125,27 @@ public:
}
Free(t, sizeof(T), source_location);
}
+
+ template<typename T>
+ gsl::owner<Span<T>> NewArray(int64_t count, const SourceLocation& source_location = {})
+ requires std::is_default_constructible_v<T>
+ {
+ Expects(count > 0);
+
+ auto* raw = Allocate((int64_t)sizeof(T) * count, source_location);
+ if constexpr (std::is_trivially_default_constructible_v<T>)
+ {
+ MemoryZero(raw, (int64_t)sizeof(T) * count);
+ }
+ else
+ {
+ for (int64_t i = 0; i < count; ++i)
+ {
+ new((T*)raw + i) T{};
+ }
+ }
+ return Span<T>{ (T*)raw, count };
+ }
};
class AllocatorApi
diff --git a/deimos/core/base.h b/deimos/core/base.h
index 5cd3a40..70958a5 100644
--- a/deimos/core/base.h
+++ b/deimos/core/base.h
@@ -5,7 +5,13 @@
#define deimos_StaticAssert(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
-#define deimos_Panic(MSG) do { __builtin_trap(); } while (0)
+[[noreturn]]
+inline void deimos_Trap()
+{
+ __builtin_trap();
+}
+
+#define deimos_Panic(MSG) do { deimos_Trap(); } while (0)
#define deimos_NO_COPY(TYPE) \
TYPE(const TYPE&) = delete; \
@@ -78,6 +84,11 @@ constexpr void MemoryCopy(void* dst, const void* src, int64_t size)
__builtin_memcpy(dst, src, (size_t)size);
}
+inline void MemoryZero(void* dst, int64_t size)
+{
+ __builtin_memset(dst, 0, (size_t)size);
+}
+
template<typename T, int64_t N>
constexpr int64_t ArraySize(const T (&)[N]) { return N; }
@@ -117,6 +128,12 @@ public:
constexpr T* end() const { return m_begin + m_size; } // NOLINT
constexpr int64_t size() const { return m_size; }
constexpr bool empty() const { return m_size == 0; }
+
+ constexpr T& operator[](int64_t i) const
+ {
+ Expects(i >= 0 && i < m_size);
+ return m_begin[i]; // NOLINT
+ }
};
template<typename T>
diff --git a/deimos/core/log.cpp b/deimos/core/log.cpp
index e05c360..b8e7805 100644
--- a/deimos/core/log.cpp
+++ b/deimos/core/log.cpp
@@ -35,10 +35,12 @@ public:
m_writer(os_console_api, OsConsoleType::kStdOut)
{}
- void Log(LogSeverity severity, const SourceLocation& location, StringView msg) override
+ void Log(LogSeverity severity, const SourceLocation& /* location */, StringView msg) override
{
- Format(&m_writer, "$[ $ ] $:$: $\033[0m\n", SeverityToColor(severity),
- SeverityToStr(severity), location.file, location.line, msg);
+ // Format(&m_writer, "$[ $ ] $:$: $\033[0m\n", SeverityToColor(severity),
+ // SeverityToStr(severity), location.file, location.line, msg);
+ Format(&m_writer, "$[ $ ] $\033[0m\n", SeverityToColor(severity),
+ SeverityToStr(severity), msg);
}
};
diff --git a/deimos/core/status.h b/deimos/core/status.h
index 912d4c8..8141dad 100644
--- a/deimos/core/status.h
+++ b/deimos/core/status.h
@@ -147,18 +147,18 @@ public:
StatusOr(const Status& status) : m_status{status} // NOLINT
{
+ Expects(!m_status.ok());
if (m_status.ok())
{
- deimos_Panic("Cannot construct a StatusOr from OK");
m_status = InternalError("StatusOr constructed from OK");
}
}
StatusOr(Status&& status) : m_status{std::move(status)} // NOLINT
{
+ Expects(!m_status.ok());
if (m_status.ok())
{
- deimos_Panic("Cannot construct a StatusOr from OK");
m_status = InternalError("StatusOr constructed from OK");
}
}
@@ -229,6 +229,16 @@ public:
}
constexpr bool ok() const { return m_status.ok(); }
+
+ constexpr StatusCode code() const { return m_status.code(); }
+
+ constexpr const Status& status() const { return m_status; }
+
+ constexpr const T& value() const & { Expects(m_status.ok()); return m_value; }
+
+ constexpr T& value() & { Expects(m_status.ok()); return m_value; }
+
+ constexpr T&& value() && { Expects(m_status.ok()); return std::move(m_value); }
friend void DeimosFormat(IWriter* writer, const StatusOr<T>& status)
{
diff --git a/deimos/core/std.h b/deimos/core/std.h
index 47f161a..27b5bc4 100644
--- a/deimos/core/std.h
+++ b/deimos/core/std.h
@@ -26,6 +26,7 @@ template<typename T> concept unsigned_integral = integral<T> && __is_unsigned(T)
template<typename T> constexpr bool is_trivially_destructible_v = __is_trivially_destructible(T);
template<typename T, typename... Args> constexpr bool is_constructible_v = __is_constructible(T, Args...);
template<typename T> constexpr bool is_default_constructible_v = __is_constructible(T);
+template<typename T> constexpr bool is_trivially_default_constructible_v = __is_trivially_constructible(T);
template<typename T> constexpr bool is_copy_constructible_v = __is_constructible(T, const T&);
template<typename T> constexpr bool is_move_constructible_v = __is_constructible(T, T&&);
template<typename T> constexpr bool is_copy_assignable_v = __is_assignable(T, const T&);
diff --git a/deimos/core/temp_allocator.cpp b/deimos/core/temp_allocator.cpp
index d2b7900..99ee630 100644
--- a/deimos/core/temp_allocator.cpp
+++ b/deimos/core/temp_allocator.cpp
@@ -35,7 +35,6 @@ public:
if (new_current > m_reserve_end)
{
deimos_Panic("Ran out of temporary memory");
- return nullptr;
}
if (new_current > m_commit_end)
@@ -73,15 +72,8 @@ public:
{
void* rewind_base = std::bit_cast<void*>(tag.tag);
Expects(rewind_base >= m_base && rewind_base <= m_commit_end);
-
- if (rewind_base < m_current)
- {
- m_current = rewind_base;
- }
- else
- {
- deimos_Panic("Invalid temporary allocator rewind");
- }
+ Expects(rewind_base <= m_current);
+ m_current = rewind_base;
}
};