xrpld
Loading...
Searching...
No Matches
STIssue.h
1#pragma once
2
3#include <xrpl/basics/CountedObject.h>
4#include <xrpl/basics/contract.h>
5#include <xrpl/json/json_value.h>
6#include <xrpl/protocol/Asset.h>
7#include <xrpl/protocol/Concepts.h>
8#include <xrpl/protocol/Issue.h>
9#include <xrpl/protocol/SField.h>
10#include <xrpl/protocol/STBase.h>
11#include <xrpl/protocol/Serializer.h>
12
13#include <compare>
14#include <cstddef>
15#include <stdexcept>
16#include <string>
17
18namespace xrpl {
19
20class STIssue final : public STBase, CountedObject<STIssue>
21{
22private:
24
25public:
27
28 STIssue() = default;
29 STIssue(STIssue const& rhs) = default;
30
31 explicit STIssue(SerialIter& sit, SField const& name);
32
33 template <AssetType A>
34 explicit STIssue(SField const& name, A const& issue);
35
36 explicit STIssue(SField const& name);
37
38 STIssue&
39 operator=(STIssue const& rhs) = default;
40
41 template <ValidIssueType TIss>
42 TIss const&
43 get() const;
44
45 template <ValidIssueType TIss>
46 [[nodiscard]] bool
47 holds() const;
48
49 [[nodiscard]] value_type const&
50 value() const noexcept;
51
52 void
53 setIssue(Asset const& issue);
54
55 [[nodiscard]] SerializedTypeID
56 getSType() const override;
57
58 [[nodiscard]] std::string
59 getText() const override;
60
61 [[nodiscard]] json::Value getJson(JsonOptions) const override;
62
63 void
64 add(Serializer& s) const override;
65
66 [[nodiscard]] bool
67 isEquivalent(STBase const& t) const override;
68
69 [[nodiscard]] bool
70 isDefault() const override;
71
72 friend constexpr bool
73 operator==(STIssue const& lhs, STIssue const& rhs);
74
75 friend constexpr std::weak_ordering
76 operator<=>(STIssue const& lhs, STIssue const& rhs);
77
78 friend constexpr bool
79 operator==(STIssue const& lhs, Asset const& rhs);
80
81 friend constexpr std::weak_ordering
82 operator<=>(STIssue const& lhs, Asset const& rhs);
83
84private:
85 STBase*
86 copy(std::size_t n, void* buf) const override;
87 STBase*
88 move(std::size_t n, void* buf) override;
89
90 friend class detail::STVar;
91};
92
93template <AssetType A>
94STIssue::STIssue(SField const& name, A const& asset) : STBase{name}, asset_{asset}
95{
96 if (holds<Issue>() && !isConsistent(asset_.get<Issue>()))
97 Throw<std::runtime_error>("Invalid asset: currency and account native mismatch");
98}
99
101issueFromJson(SField const& name, json::Value const& v);
102
103template <ValidIssueType TIss>
104bool
106{
107 return asset_.holds<TIss>();
108}
109
110template <ValidIssueType TIss>
111TIss const&
113{
114 if (!holds<TIss>(asset_))
115 Throw<std::runtime_error>("Asset doesn't hold the requested issue");
116 return std::get<TIss>(asset_);
117}
118
119inline STIssue::value_type const&
120STIssue::value() const noexcept
121{
122 return asset_;
123}
124
125inline void
127{
128 if (holds<Issue>() && !isConsistent(asset_.get<Issue>()))
129 Throw<std::runtime_error>("Invalid asset: currency and account native mismatch");
130
131 asset_ = asset;
132}
133
134constexpr bool
135operator==(STIssue const& lhs, STIssue const& rhs)
136{
137 return lhs.asset_ == rhs.asset_;
138}
139
141operator<=>(STIssue const& lhs, STIssue const& rhs)
142{
143 return lhs.asset_ <=> rhs.asset_;
144}
145
146constexpr bool
147operator==(STIssue const& lhs, Asset const& rhs)
148{
149 return lhs.asset_ == rhs;
150}
151
153operator<=>(STIssue const& lhs, Asset const& rhs)
154{
155 return lhs.asset_ <=> rhs;
156}
157
158} // namespace xrpl
constexpr TIss const & get() const
A currency issued by an account.
Definition Issue.h:18
Identifies fields.
Definition SField.h:132
void add(Serializer &s) const override
Definition STIssue.cpp:96
friend constexpr bool operator==(STIssue const &lhs, STIssue const &rhs)
Definition STIssue.h:135
STIssue & operator=(STIssue const &rhs)=default
bool isDefault() const override
Definition STIssue.cpp:125
friend constexpr std::weak_ordering operator<=>(STIssue const &lhs, STIssue const &rhs)
Definition STIssue.h:141
STIssue()=default
Asset asset_
Definition STIssue.h:23
friend class detail::STVar
Definition STIssue.h:90
STIssue(STIssue const &rhs)=default
SerializedTypeID getSType() const override
Definition STIssue.cpp:76
void setIssue(Asset const &issue)
Definition STIssue.h:126
STBase * copy(std::size_t n, void *buf) const override
Definition STIssue.cpp:133
bool holds() const
Definition STIssue.h:105
TIss const & get() const
json::Value getJson(JsonOptions) const override
Definition STIssue.cpp:88
std::string getText() const override
Definition STIssue.cpp:82
STBase * move(std::size_t n, void *buf) override
Definition STIssue.cpp:139
bool isEquivalent(STBase const &t) const override
Definition STIssue.cpp:118
Asset value_type
Definition STIssue.h:26
value_type const & value() const noexcept
Definition STIssue.h:120
JSON (JavaScript Object Notation).
Definition json_errors.h:5
STL namespace.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
Definition Issue.h:108
Issue issueFromJson(json::Value const &v)
Definition Issue.cpp:89
SerializedTypeID
Definition SField.h:94
bool isConsistent(Asset const &asset)
Definition Asset.h:323
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
Definition contract.h:52
Note, should be treated as flags that can be | and &.
Definition STBase.h:22