StormByte 2.0.0
C++26 foundation of the StormByte suite
 
Loading...
Searching...
No Matches
error.hxx
Go to the documentation of this file.
1/*
2 * Copyright (C) 2024-2026 David C. Manuelda (StormBytePP)
3 *
4 * This file is part of StormByte.
5 *
6 * StormByte original source is dual-licensed:
7 *
8 * 1. GNU Lesser General Public License v3.0 (or later)
9 * You may redistribute and/or modify this file under the terms of the
10 * GNU Lesser General Public License as published by the Free Software
11 * Foundation, either version 3 of the License, or (at your option)
12 * any later version.
13 *
14 * 2. Commercial license
15 * Alternatively, this file may be used under the terms of a commercial
16 * license agreement with the copyright holder
17 * (David C. Manuelda <StormByte@gmail.com>).
18 *
19 * Both licenses apply only to original StormByte source in this repository.
20 * They do not cover other StormByte modules or any third-party material
21 * shipped with this repository (including everything under thirdparty/),
22 * which remains under its own license.
23 *
24 * Neither license grants any patent rights. Any patent licenses required
25 * to use this software or third-party components must be obtained separately
26 * from the patent holders.
27 *
28 * StormByte is distributed in the hope that it will be useful,
29 * but WITHOUT ANY WARRANTY; without even the implied warranty of
30 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31 * GNU Lesser General Public License for more details.
32 *
33 * You should have received a copy of the GNU Lesser General Public License
34 * version 3 along with StormByte. If not, see
35 * <https://www.gnu.org/licenses/lgpl-3.0.html>.
36 *
37 * SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-StormByte-Commercial
38 */
39
40#pragma once
41
44
45#include <concepts>
46#include <string>
47#include <system_error>
48#include <type_traits>
49
54namespace StormByte {
63 namespace Error {
71 template<typename Enum>
72 struct Domain;
73
78 template<typename Enum>
79 concept Described = std::is_enum_v<Enum>
80 && requires(Enum e) {
81 { Domain<Enum>::Name } -> std::convertible_to<const char*>;
82 { Domain<Enum>::Message(e) } -> std::convertible_to<std::string>;
83 };
84
93 template<Described Enum>
94 class Category final: public std::error_category {
95 public:
100 const char* name() const noexcept override;
101
107 std::string message(int ev) const override;
108 };
109
114 enum class Code {
115 Success = 0,
116 Unknown
117 };
118
122 template<>
123 struct Domain<Code> {
124 static constexpr const char* Name = "StormByte";
125
131 static std::string Message(Code e) {
132 switch (e) {
133 case Code::Success:
134 return "Success";
135 case Code::Unknown:
136 return "Unknown StormByte error";
137 }
138 return "Unknown StormByte error";
139 }
140 };
141
147
155 STORMBYTE_PUBLIC std::error_code make_error_code(Code e) noexcept;
156
165 public:
174 Fault() noexcept;
175
180 explicit Fault(const std::error_code& code);
181
190 template<Described Enum>
191 explicit Fault(Enum e): Fault(make_error_code(e)) {}
192
197 Fault(const Fault& other) = default;
198
203 Fault(Fault&& other) noexcept = default;
204
208 ~Fault() noexcept = default;
209
215 Fault& operator=(const Fault& other) = default;
216
222 Fault& operator=(Fault&& other) noexcept = default;
223
235 const std::error_code& code() const noexcept;
236
241 const char* what() const noexcept;
242
247 explicit operator bool() const noexcept;
248
251 private:
252 std::error_code m_code;
253 Safe::String m_what;
254 };
255 }
256}
257
258namespace std {
262 template<>
263 struct is_error_code_enum<StormByte::Error::Code>: true_type {};
264}
std::error_category backed by StormByte::Error::Domain.
Definition error.hxx:94
const char * name() const noexcept override
Category name (Domain<Enum>::Name).
std::string message(int ev) const override
Message for the enumerator stored in ev.
Held error: an std::error_code and a StormByte::Safe::String message.
Definition error.hxx:164
Fault() noexcept
Success.
~Fault() noexcept=default
Destructor.
Fault(const Fault &other)=default
Copy constructor.
Fault(Fault &&other) noexcept=default
Move constructor.
Enum that has a StormByte::Error::Domain specialization.
Definition error.hxx:79
Code
Suite-level codes that are not module-specific.
Definition error.hxx:114
@ Unknown
Unclassified suite error.
std::error_code make_error_code(Code e) noexcept
Builds an std::error_code from StormByte::Error::Code.
const Category< Code > & category() noexcept
Process-wide category for StormByte::Error::Code.
Root namespace of the StormByte suite.
STL namespace.
static std::string Message(Code e)
Text for one suite enumerator.
Definition error.hxx:131
Description of one error-code enum.
Definition error.hxx:72
#define STORMBYTE_PUBLIC
Definition visibility.h:52