summaryrefslogtreecommitdiff
path: root/asl/status.cpp
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2025-02-17 00:21:48 +0100
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2025-02-17 22:29:50 +0100
commita141c401f78467bc15f62882fca5d55a007cacbb (patch)
tree908ac71a8640f78f45d22c6808c5fa6e373000fa /asl/status.cpp
parentcb77cbe9ce4cddad6a460aa190ff70f0c13e4703 (diff)
Reorganize everything
Diffstat (limited to 'asl/status.cpp')
-rw-r--r--asl/status.cpp96
1 files changed, 0 insertions, 96 deletions
diff --git a/asl/status.cpp b/asl/status.cpp
deleted file mode 100644
index 7db293c..0000000
--- a/asl/status.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#include "asl/status.hpp"
-#include "asl/allocator.hpp"
-#include "asl/string.hpp"
-#include "asl/atomic.hpp"
-#include "asl/format.hpp"
-#include "asl/string_builder.hpp"
-
-// @Todo Use custom allocator
-using Allocator = asl::DefaultAllocator;
-static Allocator g_allocator{};
-
-namespace
-{
-
-struct StatusInternal
-{
- asl::string<Allocator> msg;
- asl::status_code code;
- asl::atomic<int32_t> ref_count;
-
- constexpr StatusInternal(asl::string<Allocator>&& msg_, asl::status_code code_)
- : msg{ASL_MOVE(msg_)}
- , code{code_}
- {
- ASL_ASSERT(code != asl::status_code::ok);
- atomic_store(&ref_count, 1);
- }
-};
-
-} // anonymous namespace
-
-asl::status::status(status_code code, string_view msg)
- : m_payload{alloc_new<StatusInternal>(g_allocator, msg, code)}
-{}
-
-asl::status::status(status_code code, string_view fmt, span<format_internals::type_erased_arg> args)
-{
- StringWriter<Allocator> sink{g_allocator};
- format_internals::format(&sink, fmt, args);
- m_payload = alloc_new<StatusInternal>(g_allocator, ASL_MOVE(sink).finish(), code);
-}
-
-asl::status_code asl::status::code_internal() const
-{
- ASL_ASSERT(!is_inline());
- return reinterpret_cast<const StatusInternal*>(m_payload)->code;
-}
-
-asl::string_view asl::status::message_internal() const
-{
- ASL_ASSERT(!is_inline());
- return reinterpret_cast<const StatusInternal*>(m_payload)->msg;
-}
-
-void asl::status::ref()
-{
- ASL_ASSERT(!is_inline());
- auto* internal = reinterpret_cast<StatusInternal*>(m_payload);
- atomic_fetch_increment(&internal->ref_count, memory_order::relaxed);
-}
-
-void asl::status::unref()
-{
- ASL_ASSERT(!is_inline());
- auto* internal = reinterpret_cast<StatusInternal*>(m_payload);
- if (atomic_fetch_decrement(&internal->ref_count, memory_order::release) == 1)
- {
- atomic_fence(memory_order::acquire);
- alloc_delete(g_allocator, internal);
- }
-}
-
-void asl::AslFormat(asl::Formatter& f, const asl::status& s)
-{
- string_view status_str{};
-
- switch (s.code())
- {
- case status_code::ok: status_str = "ok"_sv; break;
- case status_code::unknown: status_str = "unknown"_sv; break;
- case status_code::internal: status_str = "internal"_sv; break;
- case status_code::runtime: status_str = "runtime"_sv; break;
- case status_code::invalid_argument: status_str = "invalid_argument"_sv; break;
- default: status_str = "<unknown>"_sv; break;
- }
-
- if (s.is_inline())
- {
- format(f.writer(), "[{}]", status_str);
- }
- else
- {
- format(f.writer(), "[{}: {}]", status_str, s.message_internal());
- }
-}
-