Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/src/common/error.h
4223 views
1
// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <[email protected]>
2
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
3
4
#pragma once
5
6
#include "types.h"
7
8
#include "fmt/base.h"
9
10
#include <string>
11
#include <string_view>
12
13
class Error
14
{
15
public:
16
Error();
17
Error(const Error& e);
18
Error(Error&& e);
19
~Error();
20
21
enum class Type
22
{
23
None = 0,
24
Errno = 1,
25
Socket = 2,
26
User = 3,
27
Win32 = 4,
28
HResult = 5,
29
};
30
31
ALWAYS_INLINE Type GetType() const { return m_type; }
32
ALWAYS_INLINE bool IsValid() const { return (m_type != Type::None); }
33
ALWAYS_INLINE const std::string& GetDescription() const { return m_description; }
34
ALWAYS_INLINE std::string TakeDescription() { return std::move(m_description); }
35
36
void Clear();
37
38
/// Error that is set by system functions, such as open().
39
void SetErrno(int err);
40
void SetErrno(std::string_view prefix, int err);
41
42
/// Error that is set by socket functions, such as socket(). On Unix this is the same as errno.
43
void SetSocket(int err);
44
void SetSocket(std::string_view prefix, int err);
45
46
/// Set both description and message.
47
void SetString(std::string description);
48
void SetStringView(std::string_view description);
49
50
#ifdef _WIN32
51
/// Error that is returned by some Win32 functions, such as RegOpenKeyEx. Also used by other APIs through
52
/// GetLastError().
53
void SetWin32(unsigned long err);
54
void SetWin32(std::string_view prefix, unsigned long err);
55
56
/// Error that is returned by Win32 COM methods, e.g. S_OK.
57
void SetHResult(long err);
58
void SetHResult(std::string_view prefix, long err);
59
#endif
60
61
static Error CreateNone();
62
static Error CreateErrno(int err);
63
static Error CreateSocket(int err);
64
static Error CreateString(std::string description);
65
#ifdef _WIN32
66
static Error CreateWin32(unsigned long err);
67
static Error CreateHResult(long err);
68
#endif
69
70
// helpers for setting
71
static void Clear(Error* errptr);
72
static void SetErrno(Error* errptr, int err);
73
static void SetErrno(Error* errptr, std::string_view prefix, int err);
74
static void SetSocket(Error* errptr, int err);
75
static void SetSocket(Error* errptr, std::string_view prefix, int err);
76
static void SetString(Error* errptr, std::string description);
77
static void SetStringView(Error* errptr, std::string_view description);
78
79
#ifdef _WIN32
80
static void SetWin32(Error* errptr, unsigned long err);
81
static void SetWin32(Error* errptr, std::string_view prefix, unsigned long err);
82
static void SetHResult(Error* errptr, long err);
83
static void SetHResult(Error* errptr, std::string_view prefix, long err);
84
#endif
85
86
template<typename... T>
87
void SetStringFmt(fmt::format_string<T...> fmt, T&&... args)
88
{
89
SetStringFmtArgs(fmt, fmt::make_format_args(args...));
90
}
91
92
void AddPrefix(std::string_view prefix);
93
94
template<typename... T>
95
void AddPrefixFmt(fmt::format_string<T...> fmt, T&&... args)
96
{
97
AddPrefixFmtArgs(fmt, fmt::make_format_args(args...));
98
}
99
100
void AddSuffix(std::string_view suffix);
101
102
template<typename... T>
103
void AddSuffixFmt(fmt::format_string<T...> fmt, T&&... args)
104
{
105
AddSuffixFmtArgs(fmt, fmt::make_format_args(args...));
106
}
107
108
/// Sets a formatted message.
109
template<typename... T>
110
static void SetStringFmt(Error* errptr, fmt::format_string<T...> fmt, T&&... args)
111
{
112
if (errptr)
113
errptr->SetStringFmtArgs(fmt, fmt::make_format_args(args...));
114
}
115
116
static void AddPrefix(Error* errptr, std::string_view prefix);
117
118
template<typename... T>
119
static void AddPrefixFmt(Error* errptr, fmt::format_string<T...> fmt, T&&... args)
120
{
121
if (errptr)
122
errptr->AddPrefixFmtArgs(fmt, fmt::make_format_args(args...));
123
}
124
125
static void AddSuffix(Error* errptr, std::string_view prefix);
126
127
template<typename... T>
128
static void AddSuffixFmt(Error* errptr, fmt::format_string<T...> fmt, T&&... args)
129
{
130
if (errptr)
131
errptr->AddSuffixFmtArgs(fmt, fmt::make_format_args(args...));
132
}
133
134
Error& operator=(const Error& e);
135
Error& operator=(Error&& e);
136
bool operator==(const Error& e) const;
137
bool operator!=(const Error& e) const;
138
139
private:
140
void SetStringFmtArgs(fmt::string_view fmt, fmt::format_args args);
141
void AddPrefixFmtArgs(fmt::string_view fmt, fmt::format_args args);
142
void AddSuffixFmtArgs(fmt::string_view fmt, fmt::format_args args);
143
144
std::string m_description;
145
Type m_type = Type::None;
146
};
147
148