StormByte 2.0.0
C++26 foundation of the StormByte suite
 
Loading...
Searching...
No Matches
exception.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/cstring.hxx>
44
45#include <format>
46#include <string>
47#include <string_view>
48
53namespace StormByte {
63 struct Component {
64 std::string_view name;
65
70 constexpr explicit Component(std::string_view name) noexcept: name(name) {}
71 };
72
81 public:
86 explicit Exception(const std::string& message);
87
92 explicit Exception(std::string&& message);
93
101 template <typename... Args>
102 Exception(std::format_string<Args...> fmt, Args&&... args) {
103 if constexpr (sizeof...(Args) == 0) {
104 m_what.Reset(std::string(fmt.get()).c_str());
105 } else {
106 const std::string formatted = std::format(fmt, std::forward<Args>(args)...);
107 m_what.Reset(formatted.c_str());
108 }
109 }
110
119 template <typename... Args>
120 Exception(Component component, std::format_string<Args...> fmt, Args&&... args) {
121 const std::string formatted = std::format(fmt, std::forward<Args>(args)...);
122 const std::string full = "StormByte::" + std::string(component.name) + ": " + formatted;
123 m_what.Reset(full.c_str());
124 }
125
130 Exception(const Exception& e) = default;
131
136 Exception(Exception&& e) noexcept = default;
137
141 virtual ~Exception() noexcept = default;
142
148 Exception& operator=(const Exception& e) = default;
149
155 Exception& operator=(Exception&& e) noexcept = default;
156
161 virtual const char* what() const noexcept;
162
163 private:
164 CString m_what;
165 };
166
172 public:
173 using Exception::Exception;
174 };
175
181 public:
182 using Exception::Exception;
183 };
184
190 public:
191 using Exception::Exception;
192 };
193}
Thrown when Base64 encode or decode fails.
Definition exception.hxx:189
Owned NUL-terminated buffer, safe to use across a DLL boundary.
Definition cstring.hxx:89
Thrown when deserialization fails.
Definition exception.hxx:171
Base exception type for the suite.
Definition exception.hxx:80
virtual ~Exception() noexcept=default
Destructor.
Exception(const std::string &message)
Constructs from a string.
Exception(std::string &&message)
Constructs from a moved string.
Exception(Exception &&e) noexcept=default
Move constructor.
Exception(Component component, std::format_string< Args... > fmt, Args &&... args)
Constructs with a component prefix and std::format.
Definition exception.hxx:120
Exception(std::format_string< Args... > fmt, Args &&... args)
Constructs with std::format.
Definition exception.hxx:102
Exception(const Exception &e)=default
Copy constructor.
Thrown when an index or range is out of bounds.
Definition exception.hxx:180
Root namespace of the StormByte suite.
Wraps a module name for the component-prefixed Exception constructor.
Definition exception.hxx:63
constexpr Component(std::string_view name) noexcept
Wraps name.
Definition exception.hxx:70
std::string_view name
Module name inserted after StormByte::.
Definition exception.hxx:64
#define STORMBYTE_PUBLIC
Definition visibility.h:52