xrpld
Loading...
Searching...
No Matches
STInteger.h
1#pragma once
2
3#include <xrpl/basics/CountedObject.h>
4#include <xrpl/beast/utility/instrumentation.h>
5#include <xrpl/json/json_value.h>
6#include <xrpl/protocol/SField.h>
7#include <xrpl/protocol/STBase.h>
8#include <xrpl/protocol/Serializer.h>
9
10#include <cstddef>
11#include <cstdint>
12#include <string>
13
14namespace xrpl {
15
16template <typename Integer>
17class STInteger : public STBase, public CountedObject<STInteger<Integer>>
18{
19public:
20 using value_type = Integer;
21
22private:
23 Integer value_;
24
25public:
26 explicit STInteger(Integer v);
27 STInteger(SField const& n, Integer v = 0);
28 STInteger(SerialIter& sit, SField const& name);
29
30 [[nodiscard]] SerializedTypeID
31 getSType() const override;
32
33 [[nodiscard]] json::Value getJson(JsonOptions) const override;
34
35 [[nodiscard]] std::string
36 getText() const override;
37
38 void
39 add(Serializer& s) const override;
40
41 [[nodiscard]] bool
42 isDefault() const override;
43
44 [[nodiscard]] bool
45 isEquivalent(STBase const& t) const override;
46
49
50 [[nodiscard]] value_type
51 value() const noexcept;
52
53 void
54 setValue(Integer v);
55
56 operator Integer() const;
57
58private:
59 STBase*
60 copy(std::size_t n, void* buf) const override;
61 STBase*
62 move(std::size_t n, void* buf) override;
63
64 friend class xrpl::detail::STVar;
65};
66
67using STUInt8 = STInteger<unsigned char>;
68using STUInt16 = STInteger<std::uint16_t>;
69using STUInt32 = STInteger<std::uint32_t>;
70using STUInt64 = STInteger<std::uint64_t>;
71
72using STInt32 = STInteger<std::int32_t>;
73
74template <typename Integer>
75inline STInteger<Integer>::STInteger(Integer v) : value_(v)
76{
77}
78
79template <typename Integer>
80inline STInteger<Integer>::STInteger(SField const& n, Integer v) : STBase(n), value_(v)
81{
82}
83
84template <typename Integer>
85inline STBase*
87{
88 return emplace(n, buf, *this);
89}
90
91template <typename Integer>
92inline STBase*
94{
95 return emplace(n, buf, std::move(*this));
96}
97
98template <typename Integer>
99inline void
101{
102 XRPL_ASSERT(getFName().isBinary(), "xrpl::STInteger::add : field is binary");
103 XRPL_ASSERT(getFName().fieldType == getSType(), "xrpl::STInteger::add : field type match");
105}
106
107template <typename Integer>
108inline bool
110{
111 return value_ == 0;
112}
113
114template <typename Integer>
115inline bool
117{
118 auto const* v = dynamic_cast<STInteger const*>(&t);
119 return v && (value_ == v->value_);
120}
121
122template <typename Integer>
123inline STInteger<Integer>&
125{
126 value_ = v;
127 return *this;
128}
129
130template <typename Integer>
133{
134 return value_;
135}
136
137template <typename Integer>
138inline void
140{
141 value_ = v;
142}
143
144template <typename Integer>
146operator Integer() const
147{
148 return value_;
149}
150
151} // namespace xrpl
Represents a JSON value.
Definition json_value.h:117
Identifies fields.
Definition SField.h:132
A type which can be exported to a well known binary format.
Definition STBase.h:129
SField const & getFName() const
Definition STBase.cpp:120
static STBase * emplace(std::size_t n, void *buf, T &&val)
Definition STBase.h:226
value_type value() const noexcept
Definition STInteger.h:132
SerializedTypeID getSType() const override
void add(Serializer &s) const override
Definition STInteger.h:100
STBase * move(std::size_t n, void *buf) override
STInteger(SField const &n, Integer v=0)
Definition STInteger.h:80
Integer value_type
Definition STInteger.h:20
STInteger(SerialIter &sit, SField const &name)
STInteger & operator=(value_type const &v)
Definition STInteger.h:124
STBase * copy(std::size_t n, void *buf) const override
friend class xrpl::detail::STVar
Definition STInteger.h:64
void setValue(unsigned char v)
json::Value getJson(JsonOptions) const override
bool isEquivalent(STBase const &t) const override
Definition STInteger.h:116
STInteger(Integer v)
Definition STInteger.h:75
std::string getText() const override
bool isDefault() const override
Definition STInteger.h:109
int addInteger(Integer)
STL namespace.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
STInteger< std::uint64_t > STUInt64
Definition STInteger.h:70
STInteger< std::uint16_t > STUInt16
Definition STInteger.h:68
SerializedTypeID
Definition SField.h:94
STInteger< std::int32_t > STInt32
Definition STInteger.h:72
STInteger< unsigned char > STUInt8
Definition STInteger.h:67
STInteger< std::uint32_t > STUInt32
Definition STInteger.h:69
Note, should be treated as flags that can be | and &.
Definition STBase.h:22