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