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
42
#include <
StormByte/safe/string.hxx
>
43
#include <
StormByte/visibility.h
>
44
45
#include <concepts>
46
#include <string>
47
#include <system_error>
48
#include <type_traits>
49
54
namespace
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
146
STORMBYTE_PUBLIC
const
Category<Code>
&
category
() noexcept;
147
155
STORMBYTE_PUBLIC
std
::error_code
make_error_code
(
Code
e) noexcept;
156
164
class
STORMBYTE_PUBLIC
Fault
{
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
258
namespace
std
{
262
template
<>
263
struct
is_error_code_enum<
StormByte
::
Error::Code
>: true_type {};
264
}
StormByte::Error::Category
std::error_category backed by StormByte::Error::Domain.
Definition
error.hxx:94
StormByte::Error::Category::name
const char * name() const noexcept override
Category name (Domain<Enum>::Name).
StormByte::Error::Category::message
std::string message(int ev) const override
Message for the enumerator stored in ev.
StormByte::Error::Fault
Held error: an std::error_code and a StormByte::Safe::String message.
Definition
error.hxx:164
StormByte::Error::Fault::Fault
Fault() noexcept
Success.
StormByte::Error::Fault::~Fault
~Fault() noexcept=default
Destructor.
StormByte::Error::Fault::Fault
Fault(const Fault &other)=default
Copy constructor.
StormByte::Error::Fault::Fault
Fault(Fault &&other) noexcept=default
Move constructor.
StormByte::Error::Described
Enum that has a StormByte::Error::Domain specialization.
Definition
error.hxx:79
StormByte::Error::Code
Code
Suite-level codes that are not module-specific.
Definition
error.hxx:114
StormByte::Error::Code::Success
@ Success
No error.
StormByte::Error::Code::Unknown
@ Unknown
Unclassified suite error.
StormByte::Error::make_error_code
std::error_code make_error_code(Code e) noexcept
Builds an std::error_code from StormByte::Error::Code.
StormByte::Error::category
const Category< Code > & category() noexcept
Process-wide category for StormByte::Error::Code.
StormByte
Root namespace of the StormByte suite.
std
STL namespace.
string.hxx
StormByte::Error::Domain< Code >::Message
static std::string Message(Code e)
Text for one suite enumerator.
Definition
error.hxx:131
StormByte::Error::Domain
Description of one error-code enum.
Definition
error.hxx:72
visibility.h
STORMBYTE_PUBLIC
#define STORMBYTE_PUBLIC
Definition
visibility.h:52
lib
public
StormByte
error.hxx
Generated by
1.9.8