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 <array>
28#include <bitset>
29#include <map>
30#include <optional>
31#include <string>
32
86namespace ripple {
87
88enum class VoteBehavior : int { Obsolete = -1, DefaultNo = 0, DefaultYes };
89enum class AmendmentSupport : int { Retired = -1, Supported = 0, Unsupported };
90
94
95namespace detail {
96
97#pragma push_macro("XRPL_FEATURE")
98#undef XRPL_FEATURE
99#pragma push_macro("XRPL_FIX")
100#undef XRPL_FIX
101#pragma push_macro("XRPL_RETIRE")
102#undef XRPL_RETIRE
103#pragma push_macro("XRPL_ABANDON")
104#undef XRPL_ABANDON
105
106#define XRPL_FEATURE(name, supported, vote) +1
107#define XRPL_FIX(name, supported, vote) +1
108#define XRPL_RETIRE(name) +1
109#define XRPL_ABANDON(name) +1
110
111// This value SHOULD be equal to the number of amendments registered in
112// Feature.cpp. Because it's only used to reserve storage, and determine how
113// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
114// the actual number of amendments. A LogicError on startup will verify this.
115static constexpr std::size_t numFeatures =
116 (0 +
117#include <xrpl/protocol/detail/features.macro>
118 );
119
120#undef XRPL_RETIRE
121#pragma pop_macro("XRPL_RETIRE")
122#undef XRPL_FIX
123#pragma pop_macro("XRPL_FIX")
124#undef XRPL_FEATURE
125#pragma pop_macro("XRPL_FEATURE")
126#undef XRPL_ABANDON
127#pragma pop_macro("XRPL_ABANDON")
128
134
141
148
149} // namespace detail
150
153
154size_t
156
158bitsetIndexToFeature(size_t i);
159
161featureToName(uint256 const& f);
162
163class FeatureBitset : private std::bitset<detail::numFeatures>
164{
166
167 template <class... Fs>
168 void
169 initFromFeatures(uint256 const& f, Fs&&... fs)
170 {
171 set(f);
172 if constexpr (sizeof...(fs) > 0)
173 initFromFeatures(std::forward<Fs>(fs)...);
174 }
175
176public:
177 using base::bitset;
178 using base::operator==;
179
180 using base::all;
181 using base::any;
182 using base::count;
183 using base::flip;
184 using base::none;
185 using base::reset;
186 using base::set;
187 using base::size;
188 using base::test;
189 using base::operator[];
190 using base::to_string;
191 using base::to_ullong;
192 using base::to_ulong;
193
194 FeatureBitset() = default;
195
196 explicit FeatureBitset(base const& b) : base(b)
197 {
198 XRPL_ASSERT(
199 b.count() == count(),
200 "ripple::FeatureBitset::FeatureBitset(base) : count match");
201 }
202
203 template <class... Fs>
204 explicit FeatureBitset(uint256 const& f, Fs&&... fs)
205 {
206 initFromFeatures(f, std::forward<Fs>(fs)...);
207 XRPL_ASSERT(
208 count() == (sizeof...(fs) + 1),
209 "ripple::FeatureBitset::FeatureBitset(uint256) : count and "
210 "sizeof... do match");
211 }
212
213 template <class Col>
214 explicit FeatureBitset(Col const& fs)
215 {
216 for (auto const& f : fs)
218 XRPL_ASSERT(
219 fs.size() == count(),
220 "ripple::FeatureBitset::FeatureBitset(Container auto) : count and "
221 "size do match");
222 }
223
224 auto
226 {
228 }
229
230 auto
231 operator[](uint256 const& f) const
232 {
234 }
235
237 set(uint256 const& f, bool value = true)
238 {
240 return *this;
241 }
242
244 reset(uint256 const& f)
245 {
247 return *this;
248 }
249
251 flip(uint256 const& f)
252 {
254 return *this;
255 }
256
259 {
260 base::operator&=(rhs);
261 return *this;
262 }
263
266 {
267 base::operator|=(rhs);
268 return *this;
269 }
270
272 operator~() const
273 {
275 }
276
277 friend FeatureBitset
278 operator&(FeatureBitset const& lhs, FeatureBitset const& rhs)
279 {
280 return FeatureBitset{
281 static_cast<base const&>(lhs) & static_cast<base const&>(rhs)};
282 }
283
284 friend FeatureBitset
285 operator&(FeatureBitset const& lhs, uint256 const& rhs)
286 {
287 return lhs & FeatureBitset{rhs};
288 }
289
290 friend FeatureBitset
291 operator&(uint256 const& lhs, FeatureBitset const& rhs)
292 {
293 return FeatureBitset{lhs} & rhs;
294 }
295
296 friend FeatureBitset
297 operator|(FeatureBitset const& lhs, FeatureBitset const& rhs)
298 {
299 return FeatureBitset{
300 static_cast<base const&>(lhs) | static_cast<base const&>(rhs)};
301 }
302
303 friend FeatureBitset
304 operator|(FeatureBitset const& lhs, uint256 const& rhs)
305 {
306 return lhs | FeatureBitset{rhs};
307 }
308
309 friend FeatureBitset
310 operator|(uint256 const& lhs, FeatureBitset const& rhs)
311 {
312 return FeatureBitset{lhs} | rhs;
313 }
314
315 friend FeatureBitset
316 operator^(FeatureBitset const& lhs, FeatureBitset const& rhs)
317 {
318 return FeatureBitset{
319 static_cast<base const&>(lhs) ^ static_cast<base const&>(rhs)};
320 }
321
322 friend FeatureBitset
323 operator^(FeatureBitset const& lhs, uint256 const& rhs)
324 {
325 return lhs ^ FeatureBitset { rhs };
326 }
327
328 friend FeatureBitset
329 operator^(uint256 const& lhs, FeatureBitset const& rhs)
330 {
331 return FeatureBitset{lhs} ^ rhs;
332 }
333
334 // set difference
335 friend FeatureBitset
336 operator-(FeatureBitset const& lhs, FeatureBitset const& rhs)
337 {
338 return lhs & ~rhs;
339 }
340
341 friend FeatureBitset
342 operator-(FeatureBitset const& lhs, uint256 const& rhs)
343 {
344 return lhs - FeatureBitset{rhs};
345 }
346
347 friend FeatureBitset
348 operator-(uint256 const& lhs, FeatureBitset const& rhs)
349 {
350 return FeatureBitset{lhs} - rhs;
351 }
352};
353
354template <class F>
355void
357{
358 for (size_t i = 0; i < bs.size(); ++i)
359 if (bs[i])
361}
362
363#pragma push_macro("XRPL_FEATURE")
364#undef XRPL_FEATURE
365#pragma push_macro("XRPL_FIX")
366#undef XRPL_FIX
367#pragma push_macro("XRPL_RETIRE")
368#undef XRPL_RETIRE
369#pragma push_macro("XRPL_ABANDON")
370#undef XRPL_ABANDON
371
372#define XRPL_FEATURE(name, supported, vote) extern uint256 const feature##name;
373#define XRPL_FIX(name, supported, vote) extern uint256 const fix##name;
374#define XRPL_RETIRE(name)
375#define XRPL_ABANDON(name)
376
377#include <xrpl/protocol/detail/features.macro>
378
379#undef XRPL_RETIRE
380#pragma pop_macro("XRPL_RETIRE")
381#undef XRPL_FIX
382#pragma pop_macro("XRPL_FIX")
383#undef XRPL_FEATURE
384#pragma pop_macro("XRPL_FEATURE")
385#undef XRPL_ABANDON
386#pragma pop_macro("XRPL_ABANDON")
387
388} // namespace ripple
389
390#endif
friend FeatureBitset operator|(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:297
friend FeatureBitset operator&(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:285
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:342
friend FeatureBitset operator|(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:310
FeatureBitset & operator|=(FeatureBitset const &rhs)
Definition: Feature.h:265
friend FeatureBitset operator^(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:323
auto operator[](uint256 const &f)
Definition: Feature.h:225
void initFromFeatures(uint256 const &f, Fs &&... fs)
Definition: Feature.h:169
friend FeatureBitset operator|(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:304
friend FeatureBitset operator&(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:291
friend FeatureBitset operator^(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:316
FeatureBitset(uint256 const &f, Fs &&... fs)
Definition: Feature.h:204
FeatureBitset operator~() const
Definition: Feature.h:272
friend FeatureBitset operator^(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:329
friend FeatureBitset operator&(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:278
friend FeatureBitset operator-(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:348
FeatureBitset & flip(uint256 const &f)
Definition: Feature.h:251
FeatureBitset(Col const &fs)
Definition: Feature.h:214
FeatureBitset & set(uint256 const &f, bool value=true)
Definition: Feature.h:237
friend FeatureBitset operator-(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:336
FeatureBitset(base const &b)
Definition: Feature.h:196
FeatureBitset & operator&=(FeatureBitset const &rhs)
Definition: Feature.h:258
FeatureBitset & reset(uint256 const &f)
Definition: Feature.h:244
auto operator[](uint256 const &f) const
Definition: Feature.h:231
static constexpr std::size_t numFeatures
Definition: Feature.h:115
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:26
uint256 bitsetIndexToFeature(size_t i)
Definition: Feature.cpp:423
AmendmentSupport
Definition: Feature.h:89
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:88
void foreachFeature(FeatureBitset bs, F &&f)
Definition: Feature.h:356