[ox/std] Add source_location
Some checks failed
Build / build (push) Has been cancelled

This commit is contained in:
Gary Talent 2024-12-12 22:36:48 -06:00
parent e6777b0ad7
commit e849e7a3dd
2 changed files with 90 additions and 4 deletions

View File

@ -26,6 +26,7 @@ class exception {
#include "defines.hpp" #include "defines.hpp"
#include "def.hpp" #include "def.hpp"
#include "source_location.hpp"
#include "typetraits.hpp" #include "typetraits.hpp"
#include "utility.hpp" #include "utility.hpp"
@ -45,16 +46,35 @@ struct [[nodiscard]] Error {
constexpr Error() noexcept = default; constexpr Error() noexcept = default;
explicit constexpr Error(ErrorCode ec) noexcept: errCode(ec) { explicit constexpr Error(
} const char *file,
uint32_t const line,
explicit constexpr Error(const char *file, uint32_t line, ErrorCode errCode, const char *msg = nullptr) noexcept { ErrorCode const errCode,
const char *msg = nullptr) noexcept {
this->file = file; this->file = file;
this->line = static_cast<uint16_t>(line); this->line = static_cast<uint16_t>(line);
this->msg = msg; this->msg = msg;
this->errCode = errCode; 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<uint16_t>(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<uint16_t>(src.line());
this->msg = msg;
this->errCode = errCode;
}
constexpr Error(const Error &o) noexcept { constexpr Error(const Error &o) noexcept {
this->msg = o.msg; this->msg = o.msg;
this->file = o.file; this->file = o.file;

66
deps/ox/src/ox/std/source_location.hpp vendored Normal file
View File

@ -0,0 +1,66 @@
/*
* 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(<source_location>)
#include <source_location>
#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{};
};
static constexpr __impl Default{
._M_file_name = "",
._M_function_name = "",
._M_line = {},
._M_column = {},
};
__impl const*m_data{&Default};
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.m_data = static_cast<__impl const*>(pSl);
return sl;
}
constexpr uint32_t line() const noexcept {
return m_data->_M_line;
}
constexpr uint32_t column() const noexcept {
return m_data->_M_column;
}
constexpr ox::CString file_name() const noexcept {
return m_data->_M_file_name;
}
constexpr ox::CString function_name() const noexcept {
return m_data->_M_function_name;
}
};
}
#endif