xrpld
Loading...
Searching...
No Matches
SField.cpp
1#include <xrpl/protocol/SField.h>
2
3#include <xrpl/beast/utility/instrumentation.h>
4
5#include <string>
6#include <unordered_map>
7
8namespace xrpl {
9
10// Storage for static const members.
12int SField::num = 0;
13std::unordered_map<int, SField const*> SField::knownCodeToField;
14std::unordered_map<std::string, SField const*> SField::knownNameToField;
15
16// Give only this translation unit permission to construct SFields
18{
19 explicit PrivateAccessTagT() = default;
20};
21
23
24template <class T>
25template <class... Args>
27 : SField(pat, std::forward<Args>(args)...)
28{
29}
30
31// Construct all compile-time SFields, and register them in the knownCodeToField
32// and knownNameToField databases:
33
34// Use macros for most SField construction to enforce naming conventions.
35#pragma push_macro("UNTYPED_SFIELD")
36#undef UNTYPED_SFIELD
37#pragma push_macro("TYPED_SFIELD")
38#undef TYPED_SFIELD
39
40#define UNTYPED_SFIELD(sfName, stiSuffix, fieldValue, ...) \
41 SField const sfName( \
42 access, \
43 STI_##stiSuffix, \
44 fieldValue, \
45 std::string_view(#sfName).substr(2).data(), \
46 ##__VA_ARGS__);
47#define TYPED_SFIELD(sfName, stiSuffix, fieldValue, ...) \
48 SF_##stiSuffix const sfName( \
49 access, \
50 STI_##stiSuffix, \
51 fieldValue, \
52 std::string_view(#sfName).substr(2).data(), \
53 ##__VA_ARGS__);
54
55// SFields which, for historical reasons, do not follow naming conventions.
56SField const sfInvalid(access, -1, "");
57SField const sfGeneric(access, 0, "Generic");
58// The following two fields aren't used anywhere, but they break tests/have
59// downstream effects.
60SField const kSfHash(access, STI_UINT256, 257, "hash");
61SField const kSfIndex(access, STI_UINT256, 258, "index");
62
63#include <xrpl/protocol/detail/sfields.macro>
64
65#undef TYPED_SFIELD
66#pragma pop_macro("TYPED_SFIELD")
67#undef UNTYPED_SFIELD
68#pragma pop_macro("UNTYPED_SFIELD")
69
73 int fv,
74 char const* fn,
75 int meta,
76 IsSigning signing)
77 : fieldCodeMem(fieldCode(tid, fv))
78 , fieldType(tid)
79 , fieldValue(fv)
80 , fieldName(fn)
81 , fieldMeta(meta)
82 , fieldNum(++num)
83 , signingField(signing)
84 , jsonName(fieldName.c_str())
85{
86 XRPL_ASSERT(
88 "xrpl::SField::SField(tid,fv,fn,meta,signing) : fieldCode is unique");
89 XRPL_ASSERT(
90 !knownNameToField.contains(fieldName),
91 "xrpl::SField::SField(tid,fv,fn,meta,signing) : fieldName is unique");
94}
95
96SField::SField(PrivateAccessTagT, int fc, char const* fn)
97 : fieldCodeMem(fc)
98 , fieldType(STI_UNKNOWN)
99 , fieldValue(0)
100 , fieldName(fn)
102 , fieldNum(++num)
104 , jsonName(fieldName.c_str())
105{
106 XRPL_ASSERT(
108 "xrpl::SField::SField(fc,fn) : fieldCode is unique");
109 XRPL_ASSERT(
110 !knownNameToField.contains(fieldName), "xrpl::SField::SField(fc,fn) : fieldName is unique");
113}
114
115SField const&
117{
118 auto it = knownCodeToField.find(code);
119
120 if (it != knownCodeToField.end())
121 {
122 return *(it->second);
123 }
124 return sfInvalid;
125}
126
127int
128SField::compare(SField const& f1, SField const& f2)
129{
130 // -1 = f1 comes before f2, 0 = illegal combination, 1 = f1 comes after f2
131 if ((f1.fieldCodeMem <= 0) || (f2.fieldCodeMem <= 0))
132 return 0;
133
134 if (f1.fieldCodeMem < f2.fieldCodeMem)
135 return -1;
136
137 if (f2.fieldCodeMem < f1.fieldCodeMem)
138 return 1;
139
140 return 0;
141}
142
143SField const&
145{
146 auto it = knownNameToField.find(fieldName);
147
148 if (it != knownNameToField.end())
149 {
150 return *(it->second);
151 }
152 return sfInvalid;
153}
154
155} // namespace xrpl
Identifies fields.
Definition SField.h:130
int const fieldValue
Definition SField.h:152
static int num
Definition SField.h:296
static SField const & getField(int fieldCode)
Definition SField.cpp:116
static IsSigning const kNotSigning
Definition SField.h:148
int const fieldCodeMem
Definition SField.h:150
int const fieldMeta
Definition SField.h:154
std::string const fieldName
Definition SField.h:153
static std::unordered_map< std::string, SField const * > knownNameToField
Definition SField.h:298
int const fieldNum
Definition SField.h:155
static constexpr auto kSmdNever
Definition SField.h:132
json::StaticString const jsonName
Definition SField.h:157
SerializedTypeID const fieldType
Definition SField.h:151
static std::unordered_map< int, SField const * > knownCodeToField
Definition SField.h:297
static int compare(SField const &f1, SField const &f2)
Definition SField.cpp:128
SField(SField const &)=delete
IsSigning const signingField
Definition SField.h:156
STL namespace.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
SField const kSfHash(access, STI_UINT256, 257, "hash")
static SField::PrivateAccessTagT access
Definition SField.cpp:22
SField const sfGeneric
SField const kSfIndex(access, STI_UINT256, 258, "index")
int fieldCode(SerializedTypeID id, int index)
Definition SField.h:107
SerializedTypeID
Definition SField.h:93
SField const sfInvalid
TypedField(PrivateAccessTagT pat, Args &&... args)
Definition SField.cpp:26