Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
util
result.h
Go to the documentation of this file.
1
// Copyright (c) 2022-present The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
4
5
#ifndef BITCOIN_UTIL_RESULT_H
6
#define BITCOIN_UTIL_RESULT_H
7
8
#include <
attributes.h
>
9
#include <
util/translation.h
>
10
11
#include <variant>
12
13
namespace
util
{
14
15
struct
Error
{
16
bilingual_str
message
;
17
};
18
34
template
<
class
M>
35
class
Result
36
{
37
private
:
38
using
T
= std::conditional_t<std::is_same_v<M, void>, std::monostate,
M
>;
39
40
std::variant<bilingual_str, T>
m_variant
;
41
43
Result
(
const
Result
&) =
delete
;
44
49
Result
&
operator=
(
const
Result
&) =
delete
;
50
Result
&
operator=
(
Result
&&) =
delete
;
51
52
template
<
typename
FT>
53
friend
bilingual_str
ErrorString
(
const
Result<FT>
& result);
54
55
public
:
56
Result
() :
m_variant
{
std
::in_place_index_t<1>{}, std::monostate{}} {}
// constructor for void
57
Result
(
T
obj) :
m_variant
{
std
::in_place_index_t<1>{}, std::move(obj)} {}
58
Result
(
Error
error) :
m_variant
{
std
::in_place_index_t<0>{}, std::move(error.message)} {}
59
Result
(
Result
&&) =
default
;
60
~Result
() =
default
;
61
64
bool
has_value
() const noexcept {
return
m_variant
.index() == 1; }
65
const
T
&
value
() const
LIFETIMEBOUND
66
{
67
assert
(
has_value
());
68
return
std::get<1>(
m_variant
);
69
}
70
T
&
value
()
LIFETIMEBOUND
71
{
72
assert
(
has_value
());
73
return
std::get<1>(
m_variant
);
74
}
75
template
<
class
U>
76
T
value_or
(U&& default_value)
const
&
77
{
78
return
has_value
() ?
value
() : std::forward<U>(default_value);
79
}
80
template
<
class
U>
81
T
value_or
(U&& default_value) &&
82
{
83
return
has_value
() ? std::move(
value
()) : std::forward<U>(default_value);
84
}
85
explicit
operator
bool() const noexcept {
return
has_value
(); }
86
const
T
*
operator->
() const
LIFETIMEBOUND
{
return
&
value
(); }
87
const
T
&
operator*
() const
LIFETIMEBOUND
{
return
value
(); }
88
T
*
operator->
()
LIFETIMEBOUND
{
return
&
value
(); }
89
T
&
operator*
()
LIFETIMEBOUND
{
return
value
(); }
90
};
91
92
template
<
typename
T>
93
bilingual_str
ErrorString
(
const
Result<T>
& result)
94
{
95
return
result ?
bilingual_str
{} : std::get<0>(result.
m_variant
);
96
}
97
}
// namespace util
98
99
#endif
// BITCOIN_UTIL_RESULT_H
attributes.h
LIFETIMEBOUND
#define LIFETIMEBOUND
Definition
attributes.h:16
util::Result
Definition
result.h:36
util::Result::operator=
Result & operator=(const Result &)=delete
util::Result::value
T & value() LIFETIMEBOUND
Definition
result.h:70
util::Result::operator=
Result & operator=(Result &&)=delete
util::Result::operator*
T & operator*() LIFETIMEBOUND
Definition
result.h:89
util::Result::value_or
T value_or(U &&default_value) const &
Definition
result.h:76
util::Result::Result
Result(Error error)
Definition
result.h:58
util::Result::has_value
bool has_value() const noexcept
Definition
result.h:64
util::Result::operator*
const T & operator*() const LIFETIMEBOUND
Definition
result.h:87
util::Result::value
const T & value() const LIFETIMEBOUND
Definition
result.h:65
util::Result::operator->
const T * operator->() const LIFETIMEBOUND
Definition
result.h:86
util::Result::Result
Result()
Definition
result.h:56
util::Result::Result
Result(const Result &)=delete
Disallow copy constructor, require Result to be moved for efficiency.
util::Result::value_or
T value_or(U &&default_value) &&
Definition
result.h:81
util::Result::Result
Result(T obj)
Definition
result.h:57
util::Result::ErrorString
friend bilingual_str ErrorString(const Result< FT > &result)
util::Result::T
std::conditional_t< std::is_same_v< M, void >, std::monostate, M > T
Definition
result.h:38
util::Result::operator->
T * operator->() LIFETIMEBOUND
Definition
result.h:88
util::Result::m_variant
std::variant< bilingual_str, T > m_variant
Definition
result.h:40
util::Result::Result
Result(Result &&)=default
util::Result::~Result
~Result()=default
std
Definition
common.h:29
util
Definition
httpserver.h:13
util::ErrorString
bilingual_str ErrorString(const Result< T > &result)
Definition
result.h:93
ByteUnit::M
@ M
Definition
strencodings.h:49
bilingual_str
Bilingual messages:
Definition
translation.h:24
util::Error
Definition
result.h:15
util::Error::message
bilingual_str message
Definition
result.h:16
translation.h
assert
assert(!tx.IsCoinBase())
Generated on
for Bitcoin Core by
1.17.0