From 043475ab6d81bc27dd6f94b5dfc8dd3916340422 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Thu, 12 Dec 2024 22:36:48 -0600 Subject: [PATCH] [ox/std] Add source_location --- deps/ox/src/ox/std/error.hpp | 28 ++++++++++-- deps/ox/src/ox/std/source_location.hpp | 60 ++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 deps/ox/src/ox/std/source_location.hpp diff --git a/deps/ox/src/ox/std/error.hpp b/deps/ox/src/ox/std/error.hpp index 49e29174..3110feba 100644 --- a/deps/ox/src/ox/std/error.hpp +++ b/deps/ox/src/ox/std/error.hpp @@ -26,6 +26,7 @@ class exception { #include "defines.hpp" #include "def.hpp" +#include "source_location.hpp" #include "typetraits.hpp" #include "utility.hpp" @@ -45,16 +46,35 @@ struct [[nodiscard]] Error { constexpr Error() noexcept = default; - explicit constexpr Error(ErrorCode ec) noexcept: errCode(ec) { - } - - explicit constexpr Error(const char *file, uint32_t line, ErrorCode errCode, const char *msg = nullptr) noexcept { + explicit constexpr Error( + const char *file, + uint32_t const line, + ErrorCode const errCode, + const char *msg = nullptr) noexcept { this->file = file; this->line = static_cast(line); this->msg = msg; this->errCode = errCode; } + explicit constexpr Error( + ErrorCode const errCode, + std::source_location const&src = std::source_location::current()) noexcept { + this->file = src.file_name(); + this->line = static_cast(src.line()); + this->errCode = errCode; + } + + explicit constexpr Error( + ErrorCode const errCode, + const char *msg, + std::source_location const&src = std::source_location::current()) noexcept { + this->file = src.file_name(); + this->line = static_cast(src.line()); + this->msg = msg; + this->errCode = errCode; + } + constexpr Error(const Error &o) noexcept { this->msg = o.msg; this->file = o.file; diff --git a/deps/ox/src/ox/std/source_location.hpp b/deps/ox/src/ox/std/source_location.hpp new file mode 100644 index 00000000..fc570ac9 --- /dev/null +++ b/deps/ox/src/ox/std/source_location.hpp @@ -0,0 +1,60 @@ +/* + * Copyright 2015 - 2024 gary@drinkingtea.net + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#if __has_include() + +#include + +#else + +#include "types.hpp" + +namespace std { + +class source_location { + private: + struct __impl { + char const*_M_file_name{}; + char const*_M_function_name{}; + uint32_t _M_line{}; + uint32_t _M_column{}; + }; + __impl const*mData = nullptr; + using Raw = decltype(__builtin_source_location()); + + public: + constexpr source_location() noexcept = default; + + static consteval source_location current(Raw const pSl = __builtin_source_location()) noexcept { + source_location sl; + sl.mData = static_cast<__impl const*>(pSl); + return sl; + } + + constexpr uint32_t line() const noexcept { + return mData != nullptr ? mData->_M_line : 0; + } + + constexpr uint32_t column() const noexcept { + return mData != nullptr ? mData->_M_column : 0; + } + + constexpr ox::CString file_name() const noexcept { + return mData != nullptr ? mData->_M_file_name : ""; + } + + constexpr ox::CString function_name() const noexcept { + return mData != nullptr ? mData->_M_function_name : ""; + } +}; + +} + +#endif