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#pragma push_macro("XRPL_ABANDON")
103#undef XRPL_ABANDON
104
105#define XRPL_FEATURE(name, supported, vote) +1
106#define XRPL_FIX(name, supported, vote) +1
107#define XRPL_RETIRE(name) +1
108#define XRPL_ABANDON(name) +1
109
110// This value SHOULD be equal to the number of amendments registered in
111// Feature.cpp. Because it's only used to reserve storage, and determine how
112// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
113// the actual number of amendments. A LogicError on startup will verify this.
114static constexpr std::size_t numFeatures =
115 (0 +
116#include <xrpl/protocol/detail/features.macro>
117 );
118
119#undef XRPL_RETIRE
120#pragma pop_macro("XRPL_RETIRE")
121#undef XRPL_FIX
122#pragma pop_macro("XRPL_FIX")
123#undef XRPL_FEATURE
124#pragma pop_macro("XRPL_FEATURE")
125#undef XRPL_ABANDON
126#pragma pop_macro("XRPL_ABANDON")
127
133
140
147
148} // namespace detail
149
152
153size_t
155
157bitsetIndexToFeature(size_t i);
158
160featureToName(uint256 const& f);
161
162class FeatureBitset : private std::bitset<detail::numFeatures>
163{
165
166 template <class... Fs>
167 void
168 initFromFeatures(uint256 const& f, Fs&&... fs)
169 {
170 set(f);
171 if constexpr (sizeof...(fs) > 0)
172 initFromFeatures(std::forward<Fs>(fs)...);
173 }
174
175public:
176 using base::bitset;
177 using base::operator==;
178
179 using base::all;
180 using base::any;
181 using base::count;
182 using base::flip;
183 using base::none;
184 using base::reset;
185 using base::set;
186 using base::size;
187 using base::test;
188 using base::operator[];
189 using base::to_string;
190 using base::to_ullong;
191 using base::to_ulong;
192
193 FeatureBitset() = default;
194
195 explicit FeatureBitset(base const& b) : base(b)
196 {
197 XRPL_ASSERT(
198 b.count() == count(),
199 "ripple::FeatureBitset::FeatureBitset(base) : count match");
200 }
201
202 template <class... Fs>
203 explicit FeatureBitset(uint256 const& f, Fs&&... fs)
204 {
205 initFromFeatures(f, std::forward<Fs>(fs)...);
206 XRPL_ASSERT(
207 count() == (sizeof...(fs) + 1),
208 "ripple::FeatureBitset::FeatureBitset(uint256) : count and "
209 "sizeof... do match");
210 }
211
212 template <class Col>
213 explicit FeatureBitset(Col const& fs)
214 {
215 for (auto const& f : fs)
217 XRPL_ASSERT(
218 fs.size() == count(),
219 "ripple::FeatureBitset::FeatureBitset(Container auto) : count and "
220 "size do match");
221 }
222
223 auto
225 {
227 }
228
229 auto
230 operator[](uint256 const& f) const
231 {
233 }
234
236 set(uint256 const& f, bool value = true)
237 {
239 return *this;
240 }
241
243 reset(uint256 const& f)
244 {
246 return *this;
247 }
248
250 flip(uint256 const& f)
251 {
253 return *this;
254 }
255
258 {
259 base::operator&=(rhs);
260 return *this;
261 }
262
265 {
266 base::operator|=(rhs);
267 return *this;
268 }
269
271 operator~() const
272 {
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 friend FeatureBitset
315 operator^(FeatureBitset const& lhs, FeatureBitset const& rhs)
316 {
317 return FeatureBitset{
318 static_cast<base const&>(lhs) ^ static_cast<base const&>(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 // set difference
334 friend FeatureBitset
335 operator-(FeatureBitset const& lhs, FeatureBitset const& rhs)
336 {
337 return lhs & ~rhs;
338 }
339
340 friend FeatureBitset
341 operator-(FeatureBitset const& lhs, uint256 const& rhs)
342 {
343 return lhs - FeatureBitset{rhs};
344 }
345
346 friend FeatureBitset
347 operator-(uint256 const& lhs, FeatureBitset const& rhs)
348 {
349 return FeatureBitset{lhs} - rhs;
350 }
351};
352
353template <class F>
354void
356{
357 for (size_t i = 0; i < bs.size(); ++i)
358 if (bs[i])
360}
361
362#pragma push_macro("XRPL_FEATURE")
363#undef XRPL_FEATURE
364#pragma push_macro("XRPL_FIX")
365#undef XRPL_FIX
366#pragma push_macro("XRPL_RETIRE")
367#undef XRPL_RETIRE
368#pragma push_macro("XRPL_ABANDON")
369#undef XRPL_ABANDON
370
371#define XRPL_FEATURE(name, supported, vote) extern uint256 const feature##name;
372#define XRPL_FIX(name, supported, vote) extern uint256 const fix##name;
373#define XRPL_RETIRE(name)
374#define XRPL_ABANDON(name)
375
376#include <xrpl/protocol/detail/features.macro>
377
378#undef XRPL_RETIRE
379#pragma pop_macro("XRPL_RETIRE")
380#undef XRPL_FIX
381#pragma pop_macro("XRPL_FIX")
382#undef XRPL_FEATURE
383#pragma pop_macro("XRPL_FEATURE")
384#undef XRPL_ABANDON
385#pragma pop_macro("XRPL_ABANDON")
386
387} // namespace ripple
388
389#endif
friend FeatureBitset operator|(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:296
friend FeatureBitset operator&(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:284
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:341
friend FeatureBitset operator|(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:309
FeatureBitset & operator|=(FeatureBitset const &rhs)
Definition: Feature.h:264
friend FeatureBitset operator^(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:322
auto operator[](uint256 const &f)
Definition: Feature.h:224
void initFromFeatures(uint256 const &f, Fs &&... fs)
Definition: Feature.h:168
friend FeatureBitset operator|(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:303
friend FeatureBitset operator&(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:290
friend FeatureBitset operator^(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:315
FeatureBitset(uint256 const &f, Fs &&... fs)
Definition: Feature.h:203
FeatureBitset operator~() const
Definition: Feature.h:271
friend FeatureBitset operator^(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:328
friend FeatureBitset operator&(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:277
friend FeatureBitset operator-(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:347
FeatureBitset & flip(uint256 const &f)
Definition: Feature.h:250
FeatureBitset(Col const &fs)
Definition: Feature.h:213
FeatureBitset & set(uint256 const &f, bool value=true)
Definition: Feature.h:236
friend FeatureBitset operator-(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:335
FeatureBitset(base const &b)
Definition: Feature.h:195
FeatureBitset & operator&=(FeatureBitset const &rhs)
Definition: Feature.h:257
FeatureBitset & reset(uint256 const &f)
Definition: Feature.h:243
auto operator[](uint256 const &f) const
Definition: Feature.h:230
static constexpr std::size_t numFeatures
Definition: Feature.h:114
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:423
AmendmentSupport
Definition: Feature.h:88
size_t featureToBitsetIndex(uint256 const &f)
Definition: Feature.cpp:417
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:429
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:355