libmicroemu 0.2.0
ARM Microcontroller Emulator Library
Loading...
Searching...
No Matches
result.h
Go to the documentation of this file.
1
5
6#pragma once
8#include "libmicroemu/types.h"
9#include <cstdlib>
10#include <string_view>
11#include <type_traits>
12
13namespace libmicroemu::internal {
14
15template <typename T, typename TStatusCode = StatusCode> struct Result {
16 using Content = T;
17 using StatusCode = TStatusCode;
18
19 const StatusCode status_code;
20 const Content content;
21
22 constexpr bool IsOk() const noexcept { return status_code == StatusCode::kSuccess; }
23 constexpr bool IsErr() const noexcept { return status_code != StatusCode::kSuccess; }
24
25 constexpr bool operator==(Result<T> const &rhs) const noexcept {
26 return (rhs.status_code == this->status_code) && (rhs.content == this->content);
27 }
28
29 constexpr const Content &Unwrap() const noexcept {
30 if (IsErr()) {
31 abort();
32 }
33 return content;
34 }
35
36 std::string_view ToString() const noexcept { return StatusCodeToString(status_code); }
37
38 explicit constexpr Result(StatusCode status_code, Content content) noexcept
39 : status_code(status_code), content(content) {}
40
41 // Move Constructor
42 constexpr Result(Result &&r) noexcept = default;
43
44 // Move Assignment
45 constexpr Result &operator=(Result &&r) = delete; // not assignable
46
47 // Copy Constructor
48 constexpr Result(const Result &r) noexcept = default;
49
50 // Copy Assignment
51 constexpr Result &operator=(const Result &r) = delete;
52};
53
54template <> struct Result<void> {
55 using Content = void;
56
57 const StatusCode status_code;
58
59 constexpr bool IsOk() const noexcept { return status_code == StatusCode::kSuccess; }
60 constexpr bool IsErr() const noexcept { return status_code != StatusCode::kSuccess; }
61
62 constexpr bool operator==(Result<void> const &rhs) const noexcept {
63 return (rhs.status_code == this->status_code);
64 }
65
66 constexpr void Unwrap() const noexcept {
67 if (IsErr()) {
68 abort();
69 }
70 }
71
72 constexpr std::string_view ToString() const noexcept { return StatusCodeToString(status_code); }
73
74 constexpr Result(StatusCode status_code) noexcept : status_code(status_code) {}
75
76 // Move Constructor
77 constexpr Result(Result &&r) noexcept = default;
78
79 // Move Assignment
80 constexpr Result &operator=(Result &&r) = delete; // not assignable
81
82 // Copy Constructor
83 constexpr Result(const Result &r) noexcept = default;
84
85 // Copy Assignment
86 constexpr Result &operator=(const Result &r) = delete; // not assignable
87};
88
89// convience function
90template <typename T> static constexpr Result<T> Ok(const T &content) noexcept {
91 return Result<T>(StatusCode::kSuccess, content);
92}
93static constexpr Result<void> Ok() noexcept { return Result<void>(StatusCode::kSuccess); }
94
95// convience function
96template <typename T> static constexpr Result<T> Err(const StatusCode &sc) noexcept {
97 return Result<T>(sc, T());
98}
99
100static constexpr Result<void> Err(const StatusCode &sc) noexcept { return Result<void>(sc); }
101
102template <typename TIn, typename TRet>
103static constexpr std::enable_if_t<!std::is_same_v<TRet, void>, Result<TRet>>
104Err(const Result<TIn> &res) noexcept {
105 return Result<TRet>(res.status_code, TRet());
106}
107
108template <typename TIn, typename TRet>
109static constexpr std::enable_if_t<std::is_same_v<TRet, void>, Result<TRet>>
110Err(const Result<TIn> &res) noexcept {
111 return Result<TRet>(res.status_code);
112}
113
114} // namespace libmicroemu::internal
115
123#define TRY_ASSIGN(NAME, OUT_TYPE, CALL) \
124 auto r_##NAME = CALL; \
125 if (r_##NAME.IsErr()) { \
126 using t_ret_decl = decltype(CALL); \
127 using t_ret = typename t_ret_decl::Content; \
128 return Err<t_ret, OUT_TYPE>(r_##NAME); \
129 }; \
130 const auto &NAME = r_##NAME.content;
131
138#define TRY(OUT_TYPE, CALL) \
139 { \
140 auto r_tmp = CALL; \
141 if (r_tmp.IsErr()) { \
142 using t_ret_decl = decltype(CALL); \
143 using t_ret = typename t_ret_decl::Content; \
144 return Err<t_ret, OUT_TYPE>(r_tmp); \
145 }; \
146 }
The libmicroemu::internal namespace contains all classes and functions of libmicroemu which are priva...
Definition bkpt_flags.h:6
static std::string_view StatusCodeToString(const StatusCode &status_code) noexcept
Converts a status code to a string.
Definition status_code.h:108
StatusCode
Enum representing various status codes used throughout the system.
Definition status_code.h:17
@ kSuccess
Operation succeeded successfully.
Definition status_code.h:20
File contains enum class for status codes.
Definition result.h:15
Definition result.h:15