rippled
Loading...
Searching...
No Matches
Feature.h
1#ifndef XRPL_PROTOCOL_FEATURE_H_INCLUDED
2#define XRPL_PROTOCOL_FEATURE_H_INCLUDED
3
4#include <xrpl/basics/base_uint.h>
5
6#include <boost/container/flat_map.hpp>
7
8#include <bitset>
9#include <map>
10#include <optional>
11#include <string>
12
66namespace ripple {
67
68enum class VoteBehavior : int { Obsolete = -1, DefaultNo = 0, DefaultYes };
69enum class AmendmentSupport : int { Retired = -1, Supported = 0, Unsupported };
70
74
75namespace detail {
76
77#pragma push_macro("XRPL_FEATURE")
78#undef XRPL_FEATURE
79#pragma push_macro("XRPL_FIX")
80#undef XRPL_FIX
81#pragma push_macro("XRPL_RETIRE_FEATURE")
82#undef XRPL_RETIRE_FEATURE
83#pragma push_macro("XRPL_RETIRE_FIX")
84#undef XRPL_RETIRE_FIX
85
86#define XRPL_FEATURE(name, supported, vote) +1
87#define XRPL_FIX(name, supported, vote) +1
88#define XRPL_RETIRE_FEATURE(name) +1
89#define XRPL_RETIRE_FIX(name) +1
90
91// This value SHOULD be equal to the number of amendments registered in
92// Feature.cpp. Because it's only used to reserve storage, and determine how
93// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
94// the actual number of amendments. A LogicError on startup will verify this.
95static constexpr std::size_t numFeatures =
96 (0 +
97#include <xrpl/protocol/detail/features.macro>
98 );
99
100#undef XRPL_RETIRE_FEATURE
101#pragma pop_macro("XRPL_RETIRE_FEATURE")
102#undef XRPL_RETIRE_FIX
103#pragma pop_macro("XRPL_RETIRE_FIX")
104#undef XRPL_FIX
105#pragma pop_macro("XRPL_FIX")
106#undef XRPL_FEATURE
107#pragma pop_macro("XRPL_FEATURE")
108
114
121
128
129} // namespace detail
130
133
134size_t
136
138bitsetIndexToFeature(size_t i);
139
141featureToName(uint256 const& f);
142
143class FeatureBitset : private std::bitset<detail::numFeatures>
144{
146
147 template <class... Fs>
148 void
149 initFromFeatures(uint256 const& f, Fs&&... fs)
150 {
151 set(f);
152 if constexpr (sizeof...(fs) > 0)
154 }
155
156public:
157 using base::bitset;
158 using base::operator==;
159
160 using base::all;
161 using base::any;
162 using base::count;
163 using base::flip;
164 using base::none;
165 using base::reset;
166 using base::set;
167 using base::size;
168 using base::test;
169 using base::operator[];
170 using base::to_string;
171 using base::to_ullong;
172 using base::to_ulong;
173
174 FeatureBitset() = default;
175
176 explicit FeatureBitset(base const& b) : base(b)
177 {
178 XRPL_ASSERT(
179 b.count() == count(),
180 "ripple::FeatureBitset::FeatureBitset(base) : count match");
181 }
182
183 template <class... Fs>
184 explicit FeatureBitset(uint256 const& f, Fs&&... fs)
185 {
187 XRPL_ASSERT(
188 count() == (sizeof...(fs) + 1),
189 "ripple::FeatureBitset::FeatureBitset(uint256) : count and "
190 "sizeof... do match");
191 }
192
193 template <class Col>
194 explicit FeatureBitset(Col const& fs)
195 {
196 for (auto const& f : fs)
198 XRPL_ASSERT(
199 fs.size() == count(),
200 "ripple::FeatureBitset::FeatureBitset(Container auto) : count and "
201 "size do match");
202 }
203
204 auto
206 {
208 }
209
210 auto
211 operator[](uint256 const& f) const
212 {
214 }
215
217 set(uint256 const& f, bool value = true)
218 {
220 return *this;
221 }
222
224 reset(uint256 const& f)
225 {
227 return *this;
228 }
229
231 flip(uint256 const& f)
232 {
234 return *this;
235 }
236
239 {
240 base::operator&=(rhs);
241 return *this;
242 }
243
246 {
247 base::operator|=(rhs);
248 return *this;
249 }
250
252 operator~() const
253 {
255 }
256
257 friend FeatureBitset
258 operator&(FeatureBitset const& lhs, FeatureBitset const& rhs)
259 {
260 return FeatureBitset{
261 static_cast<base const&>(lhs) & static_cast<base const&>(rhs)};
262 }
263
264 friend FeatureBitset
265 operator&(FeatureBitset const& lhs, uint256 const& rhs)
266 {
267 return lhs & FeatureBitset{rhs};
268 }
269
270 friend FeatureBitset
271 operator&(uint256 const& lhs, FeatureBitset const& rhs)
272 {
273 return FeatureBitset{lhs} & rhs;
274 }
275
276 friend FeatureBitset
277 operator|(FeatureBitset const& lhs, FeatureBitset const& rhs)
278 {
279 return FeatureBitset{
280 static_cast<base const&>(lhs) | static_cast<base const&>(rhs)};
281 }
282
283 friend FeatureBitset
284 operator|(FeatureBitset const& lhs, uint256 const& rhs)
285 {
286 return lhs | FeatureBitset{rhs};
287 }
288
289 friend FeatureBitset
290 operator|(uint256 const& lhs, FeatureBitset const& rhs)
291 {
292 return FeatureBitset{lhs} | rhs;
293 }
294
295 friend FeatureBitset
296 operator^(FeatureBitset const& lhs, FeatureBitset const& rhs)
297 {
298 return FeatureBitset{
299 static_cast<base const&>(lhs) ^ static_cast<base const&>(rhs)};
300 }
301
302 friend FeatureBitset
303 operator^(FeatureBitset const& lhs, uint256 const& rhs)
304 {
305 return lhs ^ FeatureBitset { rhs };
306 }
307
308 friend FeatureBitset
309 operator^(uint256 const& lhs, FeatureBitset const& rhs)
310 {
311 return FeatureBitset{lhs} ^ rhs;
312 }
313
314 // set difference
315 friend FeatureBitset
316 operator-(FeatureBitset const& lhs, FeatureBitset const& rhs)
317 {
318 return lhs & ~rhs;
319 }
320
321 friend FeatureBitset
322 operator-(FeatureBitset const& lhs, uint256 const& rhs)
323 {
324 return lhs - FeatureBitset{rhs};
325 }
326
327 friend FeatureBitset
328 operator-(uint256 const& lhs, FeatureBitset const& rhs)
329 {
330 return FeatureBitset{lhs} - rhs;
331 }
332};
333
334template <class F>
335void
337{
338 for (size_t i = 0; i < bs.size(); ++i)
339 if (bs[i])
341}
342
343#pragma push_macro("XRPL_FEATURE")
344#undef XRPL_FEATURE
345#pragma push_macro("XRPL_FIX")
346#undef XRPL_FIX
347#pragma push_macro("XRPL_RETIRE_FEATURE")
348#undef XRPL_RETIRE_FEATURE
349#pragma push_macro("XRPL_RETIRE_FIX")
350#undef XRPL_RETIRE_FIX
351
352#define XRPL_FEATURE(name, supported, vote) extern uint256 const feature##name;
353#define XRPL_FIX(name, supported, vote) extern uint256 const fix##name;
354#define XRPL_RETIRE_FEATURE(name)
355#define XRPL_RETIRE_FIX(name)
356
357#include <xrpl/protocol/detail/features.macro>
358
359#undef XRPL_RETIRE_FEATURE
360#pragma pop_macro("XRPL_RETIRE_FEATURE")
361#undef XRPL_RETIRE_FIX
362#pragma pop_macro("XRPL_RETIRE_FIX")
363#undef XRPL_FIX
364#pragma pop_macro("XRPL_FIX")
365#undef XRPL_FEATURE
366#pragma pop_macro("XRPL_FEATURE")
367
368} // namespace ripple
369
370#endif
friend FeatureBitset operator|(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition Feature.h:277
friend FeatureBitset operator&(FeatureBitset const &lhs, uint256 const &rhs)
Definition Feature.h:265
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
Definition Feature.h:322
friend FeatureBitset operator|(uint256 const &lhs, FeatureBitset const &rhs)
Definition Feature.h:290
FeatureBitset & operator|=(FeatureBitset const &rhs)
Definition Feature.h:245
friend FeatureBitset operator^(FeatureBitset const &lhs, uint256 const &rhs)
Definition Feature.h:303
auto operator[](uint256 const &f)
Definition Feature.h:205
void initFromFeatures(uint256 const &f, Fs &&... fs)
Definition Feature.h:149
friend FeatureBitset operator|(FeatureBitset const &lhs, uint256 const &rhs)
Definition Feature.h:284
friend FeatureBitset operator&(uint256 const &lhs, FeatureBitset const &rhs)
Definition Feature.h:271
friend FeatureBitset operator^(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition Feature.h:296
FeatureBitset(uint256 const &f, Fs &&... fs)
Definition Feature.h:184
FeatureBitset operator~() const
Definition Feature.h:252
friend FeatureBitset operator^(uint256 const &lhs, FeatureBitset const &rhs)
Definition Feature.h:309
friend FeatureBitset operator&(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition Feature.h:258
friend FeatureBitset operator-(uint256 const &lhs, FeatureBitset const &rhs)
Definition Feature.h:328
FeatureBitset & flip(uint256 const &f)
Definition Feature.h:231
FeatureBitset(Col const &fs)
Definition Feature.h:194
FeatureBitset & set(uint256 const &f, bool value=true)
Definition Feature.h:217
friend FeatureBitset operator-(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition Feature.h:316
FeatureBitset(base const &b)
Definition Feature.h:176
FeatureBitset & operator&=(FeatureBitset const &rhs)
Definition Feature.h:238
FeatureBitset & reset(uint256 const &f)
Definition Feature.h:224
auto operator[](uint256 const &f) const
Definition Feature.h:211
T is_same_v
static constexpr std::size_t numFeatures
Definition Feature.h:95
std::size_t numUpVotedAmendments()
Amendments that this server will vote for by default.
Definition Feature.cpp:355
std::size_t numDownVotedAmendments()
Amendments that this server won't vote for by default.
Definition Feature.cpp:348
std::map< std::string, VoteBehavior > const & supportedAmendments()
Amendments that this server supports and the default voting behavior.
Definition Feature.cpp:341
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
uint256 bitsetIndexToFeature(size_t i)
Definition Feature.cpp:396
AmendmentSupport
Definition Feature.h:69
size_t featureToBitsetIndex(uint256 const &f)
Definition Feature.cpp:390
std::map< std::string, AmendmentSupport > const & allAmendments()
All amendments libxrpl knows about.
Definition Feature.cpp:332
std::string featureToName(uint256 const &f)
Definition Feature.cpp:402
std::optional< uint256 > getRegisteredFeature(std::string const &name)
Definition Feature.cpp:363
VoteBehavior
Definition Feature.h:68
void foreachFeature(FeatureBitset bs, F &&f)
Definition Feature.h:336