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")
82#undef XRPL_RETIRE
83
84#define XRPL_FEATURE(name, supported, vote) +1
85#define XRPL_FIX(name, supported, vote) +1
86#define XRPL_RETIRE(name) +1
87
88// This value SHOULD be equal to the number of amendments registered in
89// Feature.cpp. Because it's only used to reserve storage, and determine how
90// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
91// the actual number of amendments. A LogicError on startup will verify this.
92static constexpr std::size_t numFeatures =
93 (0 +
94#include <xrpl/protocol/detail/features.macro>
95 );
96
97#undef XRPL_RETIRE
98#pragma pop_macro("XRPL_RETIRE")
99#undef XRPL_FIX
100#pragma pop_macro("XRPL_FIX")
101#undef XRPL_FEATURE
102#pragma pop_macro("XRPL_FEATURE")
103
109
116
123
124} // namespace detail
125
128
129size_t
131
133bitsetIndexToFeature(size_t i);
134
136featureToName(uint256 const& f);
137
138class FeatureBitset : private std::bitset<detail::numFeatures>
139{
141
142 template <class... Fs>
143 void
144 initFromFeatures(uint256 const& f, Fs&&... fs)
145 {
146 set(f);
147 if constexpr (sizeof...(fs) > 0)
149 }
150
151public:
152 using base::bitset;
153 using base::operator==;
154
155 using base::all;
156 using base::any;
157 using base::count;
158 using base::flip;
159 using base::none;
160 using base::reset;
161 using base::set;
162 using base::size;
163 using base::test;
164 using base::operator[];
165 using base::to_string;
166 using base::to_ullong;
167 using base::to_ulong;
168
169 FeatureBitset() = default;
170
171 explicit FeatureBitset(base const& b) : base(b)
172 {
173 XRPL_ASSERT(
174 b.count() == count(),
175 "ripple::FeatureBitset::FeatureBitset(base) : count match");
176 }
177
178 template <class... Fs>
179 explicit FeatureBitset(uint256 const& f, Fs&&... fs)
180 {
182 XRPL_ASSERT(
183 count() == (sizeof...(fs) + 1),
184 "ripple::FeatureBitset::FeatureBitset(uint256) : count and "
185 "sizeof... do match");
186 }
187
188 template <class Col>
189 explicit FeatureBitset(Col const& fs)
190 {
191 for (auto const& f : fs)
193 XRPL_ASSERT(
194 fs.size() == count(),
195 "ripple::FeatureBitset::FeatureBitset(Container auto) : count and "
196 "size do match");
197 }
198
199 auto
201 {
203 }
204
205 auto
206 operator[](uint256 const& f) const
207 {
209 }
210
212 set(uint256 const& f, bool value = true)
213 {
215 return *this;
216 }
217
219 reset(uint256 const& f)
220 {
222 return *this;
223 }
224
226 flip(uint256 const& f)
227 {
229 return *this;
230 }
231
234 {
235 base::operator&=(rhs);
236 return *this;
237 }
238
241 {
242 base::operator|=(rhs);
243 return *this;
244 }
245
247 operator~() const
248 {
250 }
251
252 friend FeatureBitset
253 operator&(FeatureBitset const& lhs, FeatureBitset const& rhs)
254 {
255 return FeatureBitset{
256 static_cast<base const&>(lhs) & static_cast<base const&>(rhs)};
257 }
258
259 friend FeatureBitset
260 operator&(FeatureBitset const& lhs, uint256 const& rhs)
261 {
262 return lhs & FeatureBitset{rhs};
263 }
264
265 friend FeatureBitset
266 operator&(uint256 const& lhs, FeatureBitset const& rhs)
267 {
268 return FeatureBitset{lhs} & rhs;
269 }
270
271 friend FeatureBitset
272 operator|(FeatureBitset const& lhs, FeatureBitset const& rhs)
273 {
274 return FeatureBitset{
275 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{
294 static_cast<base const&>(lhs) ^ static_cast<base const&>(rhs)};
295 }
296
297 friend FeatureBitset
298 operator^(FeatureBitset const& lhs, uint256 const& rhs)
299 {
300 return lhs ^ FeatureBitset { rhs };
301 }
302
303 friend FeatureBitset
304 operator^(uint256 const& lhs, FeatureBitset const& rhs)
305 {
306 return FeatureBitset{lhs} ^ rhs;
307 }
308
309 // set difference
310 friend FeatureBitset
311 operator-(FeatureBitset const& lhs, FeatureBitset const& rhs)
312 {
313 return lhs & ~rhs;
314 }
315
316 friend FeatureBitset
317 operator-(FeatureBitset const& lhs, uint256 const& rhs)
318 {
319 return lhs - FeatureBitset{rhs};
320 }
321
322 friend FeatureBitset
323 operator-(uint256 const& lhs, FeatureBitset const& rhs)
324 {
325 return FeatureBitset{lhs} - rhs;
326 }
327};
328
329template <class F>
330void
332{
333 for (size_t i = 0; i < bs.size(); ++i)
334 if (bs[i])
336}
337
338#pragma push_macro("XRPL_FEATURE")
339#undef XRPL_FEATURE
340#pragma push_macro("XRPL_FIX")
341#undef XRPL_FIX
342#pragma push_macro("XRPL_RETIRE")
343#undef XRPL_RETIRE
344
345#define XRPL_FEATURE(name, supported, vote) extern uint256 const feature##name;
346#define XRPL_FIX(name, supported, vote) extern uint256 const fix##name;
347#define XRPL_RETIRE(name)
348
349#include <xrpl/protocol/detail/features.macro>
350
351#undef XRPL_RETIRE
352#pragma pop_macro("XRPL_RETIRE")
353#undef XRPL_FIX
354#pragma pop_macro("XRPL_FIX")
355#undef XRPL_FEATURE
356#pragma pop_macro("XRPL_FEATURE")
357
358} // namespace ripple
359
360#endif
friend FeatureBitset operator|(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition Feature.h:272
friend FeatureBitset operator&(FeatureBitset const &lhs, uint256 const &rhs)
Definition Feature.h:260
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
Definition Feature.h:317
friend FeatureBitset operator|(uint256 const &lhs, FeatureBitset const &rhs)
Definition Feature.h:285
FeatureBitset & operator|=(FeatureBitset const &rhs)
Definition Feature.h:240
friend FeatureBitset operator^(FeatureBitset const &lhs, uint256 const &rhs)
Definition Feature.h:298
auto operator[](uint256 const &f)
Definition Feature.h:200
void initFromFeatures(uint256 const &f, Fs &&... fs)
Definition Feature.h:144
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:266
friend FeatureBitset operator^(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition Feature.h:291
FeatureBitset(uint256 const &f, Fs &&... fs)
Definition Feature.h:179
FeatureBitset operator~() const
Definition Feature.h:247
friend FeatureBitset operator^(uint256 const &lhs, FeatureBitset const &rhs)
Definition Feature.h:304
friend FeatureBitset operator&(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition Feature.h:253
friend FeatureBitset operator-(uint256 const &lhs, FeatureBitset const &rhs)
Definition Feature.h:323
FeatureBitset & flip(uint256 const &f)
Definition Feature.h:226
FeatureBitset(Col const &fs)
Definition Feature.h:189
FeatureBitset & set(uint256 const &f, bool value=true)
Definition Feature.h:212
friend FeatureBitset operator-(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition Feature.h:311
FeatureBitset(base const &b)
Definition Feature.h:171
FeatureBitset & operator&=(FeatureBitset const &rhs)
Definition Feature.h:233
FeatureBitset & reset(uint256 const &f)
Definition Feature.h:219
auto operator[](uint256 const &f) const
Definition Feature.h:206
T is_same_v
static constexpr std::size_t numFeatures
Definition Feature.h:92
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:331