rippled
Loading...
Searching...
No Matches
Feature.h
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright (c) 2012, 2013 Ripple Labs Inc.
5
6 Permission to use, copy, modify, and/or distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#ifndef RIPPLE_PROTOCOL_FEATURE_H_INCLUDED
21#define RIPPLE_PROTOCOL_FEATURE_H_INCLUDED
22
23#include <xrpl/basics/base_uint.h>
24
25#include <boost/container/flat_map.hpp>
26
27#include <bitset>
28#include <map>
29#include <optional>
30#include <string>
31
85namespace ripple {
86
87enum class VoteBehavior : int { Obsolete = -1, DefaultNo = 0, DefaultYes };
88enum class AmendmentSupport : int { Retired = -1, Supported = 0, Unsupported };
89
93
94namespace detail {
95
96#pragma push_macro("XRPL_FEATURE")
97#undef XRPL_FEATURE
98#pragma push_macro("XRPL_FIX")
99#undef XRPL_FIX
100#pragma push_macro("XRPL_RETIRE")
101#undef XRPL_RETIRE
102
103#define XRPL_FEATURE(name, supported, vote) +1
104#define XRPL_FIX(name, supported, vote) +1
105#define XRPL_RETIRE(name) +1
106
107// This value SHOULD be equal to the number of amendments registered in
108// Feature.cpp. Because it's only used to reserve storage, and determine how
109// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
110// the actual number of amendments. A LogicError on startup will verify this.
111static constexpr std::size_t numFeatures =
112 (0 +
113#include <xrpl/protocol/detail/features.macro>
114 );
115
116#undef XRPL_RETIRE
117#pragma pop_macro("XRPL_RETIRE")
118#undef XRPL_FIX
119#pragma pop_macro("XRPL_FIX")
120#undef XRPL_FEATURE
121#pragma pop_macro("XRPL_FEATURE")
122
128
135
142
143} // namespace detail
144
147
148size_t
150
152bitsetIndexToFeature(size_t i);
153
155featureToName(uint256 const& f);
156
157class FeatureBitset : private std::bitset<detail::numFeatures>
158{
160
161 template <class... Fs>
162 void
163 initFromFeatures(uint256 const& f, Fs&&... fs)
164 {
165 set(f);
166 if constexpr (sizeof...(fs) > 0)
168 }
169
170public:
171 using base::bitset;
172 using base::operator==;
173
174 using base::all;
175 using base::any;
176 using base::count;
177 using base::flip;
178 using base::none;
179 using base::reset;
180 using base::set;
181 using base::size;
182 using base::test;
183 using base::operator[];
184 using base::to_string;
185 using base::to_ullong;
186 using base::to_ulong;
187
188 FeatureBitset() = default;
189
190 explicit FeatureBitset(base const& b) : base(b)
191 {
192 XRPL_ASSERT(
193 b.count() == count(),
194 "ripple::FeatureBitset::FeatureBitset(base) : count match");
195 }
196
197 template <class... Fs>
198 explicit FeatureBitset(uint256 const& f, Fs&&... fs)
199 {
201 XRPL_ASSERT(
202 count() == (sizeof...(fs) + 1),
203 "ripple::FeatureBitset::FeatureBitset(uint256) : count and "
204 "sizeof... do match");
205 }
206
207 template <class Col>
208 explicit FeatureBitset(Col const& fs)
209 {
210 for (auto const& f : fs)
212 XRPL_ASSERT(
213 fs.size() == count(),
214 "ripple::FeatureBitset::FeatureBitset(Container auto) : count and "
215 "size do match");
216 }
217
218 auto
220 {
222 }
223
224 auto
225 operator[](uint256 const& f) const
226 {
228 }
229
231 set(uint256 const& f, bool value = true)
232 {
234 return *this;
235 }
236
238 reset(uint256 const& f)
239 {
241 return *this;
242 }
243
245 flip(uint256 const& f)
246 {
248 return *this;
249 }
250
253 {
254 base::operator&=(rhs);
255 return *this;
256 }
257
260 {
261 base::operator|=(rhs);
262 return *this;
263 }
264
266 operator~() const
267 {
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 friend FeatureBitset
310 operator^(FeatureBitset const& lhs, FeatureBitset const& rhs)
311 {
312 return FeatureBitset{
313 static_cast<base const&>(lhs) ^ static_cast<base const&>(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 // set difference
329 friend FeatureBitset
330 operator-(FeatureBitset const& lhs, FeatureBitset const& rhs)
331 {
332 return lhs & ~rhs;
333 }
334
335 friend FeatureBitset
336 operator-(FeatureBitset const& lhs, uint256 const& rhs)
337 {
338 return lhs - FeatureBitset{rhs};
339 }
340
341 friend FeatureBitset
342 operator-(uint256 const& lhs, FeatureBitset const& rhs)
343 {
344 return FeatureBitset{lhs} - rhs;
345 }
346};
347
348template <class F>
349void
351{
352 for (size_t i = 0; i < bs.size(); ++i)
353 if (bs[i])
355}
356
357#pragma push_macro("XRPL_FEATURE")
358#undef XRPL_FEATURE
359#pragma push_macro("XRPL_FIX")
360#undef XRPL_FIX
361#pragma push_macro("XRPL_RETIRE")
362#undef XRPL_RETIRE
363
364#define XRPL_FEATURE(name, supported, vote) extern uint256 const feature##name;
365#define XRPL_FIX(name, supported, vote) extern uint256 const fix##name;
366#define XRPL_RETIRE(name)
367
368#include <xrpl/protocol/detail/features.macro>
369
370#undef XRPL_RETIRE
371#pragma pop_macro("XRPL_RETIRE")
372#undef XRPL_FIX
373#pragma pop_macro("XRPL_FIX")
374#undef XRPL_FEATURE
375#pragma pop_macro("XRPL_FEATURE")
376
377} // namespace ripple
378
379#endif
friend FeatureBitset operator|(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition Feature.h:291
friend FeatureBitset operator&(FeatureBitset const &lhs, uint256 const &rhs)
Definition Feature.h:279
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
Definition Feature.h:336
friend FeatureBitset operator|(uint256 const &lhs, FeatureBitset const &rhs)
Definition Feature.h:304
FeatureBitset & operator|=(FeatureBitset const &rhs)
Definition Feature.h:259
friend FeatureBitset operator^(FeatureBitset const &lhs, uint256 const &rhs)
Definition Feature.h:317
auto operator[](uint256 const &f)
Definition Feature.h:219
void initFromFeatures(uint256 const &f, Fs &&... fs)
Definition Feature.h:163
friend FeatureBitset operator|(FeatureBitset const &lhs, uint256 const &rhs)
Definition Feature.h:298
friend FeatureBitset operator&(uint256 const &lhs, FeatureBitset const &rhs)
Definition Feature.h:285
friend FeatureBitset operator^(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition Feature.h:310
FeatureBitset(uint256 const &f, Fs &&... fs)
Definition Feature.h:198
FeatureBitset operator~() const
Definition Feature.h:266
friend FeatureBitset operator^(uint256 const &lhs, FeatureBitset const &rhs)
Definition Feature.h:323
friend FeatureBitset operator&(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition Feature.h:272
friend FeatureBitset operator-(uint256 const &lhs, FeatureBitset const &rhs)
Definition Feature.h:342
FeatureBitset & flip(uint256 const &f)
Definition Feature.h:245
FeatureBitset(Col const &fs)
Definition Feature.h:208
FeatureBitset & set(uint256 const &f, bool value=true)
Definition Feature.h:231
friend FeatureBitset operator-(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition Feature.h:330
FeatureBitset(base const &b)
Definition Feature.h:190
FeatureBitset & operator&=(FeatureBitset const &rhs)
Definition Feature.h:252
FeatureBitset & reset(uint256 const &f)
Definition Feature.h:238
auto operator[](uint256 const &f) const
Definition Feature.h:225
T is_same_v
static constexpr std::size_t numFeatures
Definition Feature.h:111
std::size_t numUpVotedAmendments()
Amendments that this server will vote for by default.
Definition Feature.cpp:374
std::size_t numDownVotedAmendments()
Amendments that this server won't vote for by default.
Definition Feature.cpp:367
std::map< std::string, VoteBehavior > const & supportedAmendments()
Amendments that this server supports and the default voting behavior.
Definition Feature.cpp:360
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:25
uint256 bitsetIndexToFeature(size_t i)
Definition Feature.cpp:415
AmendmentSupport
Definition Feature.h:88
size_t featureToBitsetIndex(uint256 const &f)
Definition Feature.cpp:409
std::map< std::string, AmendmentSupport > const & allAmendments()
All amendments libxrpl knows about.
Definition Feature.cpp:351
std::string featureToName(uint256 const &f)
Definition Feature.cpp:421
std::optional< uint256 > getRegisteredFeature(std::string const &name)
Definition Feature.cpp:382
VoteBehavior
Definition Feature.h:87
void foreachFeature(FeatureBitset bs, F &&f)
Definition Feature.h:350