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
74namespace ripple {
75
76enum class VoteBehavior : int { Obsolete = -1, DefaultNo = 0, DefaultYes };
77enum class AmendmentSupport : int { Retired = -1, Supported = 0, Unsupported };
78
82
83namespace detail {
84
85#pragma push_macro("XRPL_FEATURE")
86#undef XRPL_FEATURE
87#pragma push_macro("XRPL_FIX")
88#undef XRPL_FIX
89#pragma push_macro("XRPL_RETIRE")
90#undef XRPL_RETIRE
91
92#define XRPL_FEATURE(name, supported, vote) +1
93#define XRPL_FIX(name, supported, vote) +1
94#define XRPL_RETIRE(name) +1
95
96// This value SHOULD be equal to the number of amendments registered in
97// Feature.cpp. Because it's only used to reserve storage, and determine how
98// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
99// the actual number of amendments. A LogicError on startup will verify this.
100static constexpr std::size_t numFeatures =
101 (0 +
102#include <xrpl/protocol/detail/features.macro>
103 );
104
105#undef XRPL_RETIRE
106#pragma pop_macro("XRPL_RETIRE")
107#undef XRPL_FIX
108#pragma pop_macro("XRPL_FIX")
109#undef XRPL_FEATURE
110#pragma pop_macro("XRPL_FEATURE")
111
117
124
131
132} // namespace detail
133
136
137size_t
139
141bitsetIndexToFeature(size_t i);
142
144featureToName(uint256 const& f);
145
146class FeatureBitset : private std::bitset<detail::numFeatures>
147{
149
150 template <class... Fs>
151 void
152 initFromFeatures(uint256 const& f, Fs&&... fs)
153 {
154 set(f);
155 if constexpr (sizeof...(fs) > 0)
156 initFromFeatures(std::forward<Fs>(fs)...);
157 }
158
159public:
160 using base::bitset;
161 using base::operator==;
162
163 using base::all;
164 using base::any;
165 using base::count;
166 using base::flip;
167 using base::none;
168 using base::reset;
169 using base::set;
170 using base::size;
171 using base::test;
172 using base::operator[];
173 using base::to_string;
174 using base::to_ullong;
175 using base::to_ulong;
176
177 FeatureBitset() = default;
178
179 explicit FeatureBitset(base const& b) : base(b)
180 {
181 XRPL_ASSERT(
182 b.count() == count(),
183 "ripple::FeatureBitset::FeatureBitset(base) : count match");
184 }
185
186 template <class... Fs>
187 explicit FeatureBitset(uint256 const& f, Fs&&... fs)
188 {
189 initFromFeatures(f, std::forward<Fs>(fs)...);
190 XRPL_ASSERT(
191 count() == (sizeof...(fs) + 1),
192 "ripple::FeatureBitset::FeatureBitset(uint256) : count and "
193 "sizeof... do match");
194 }
195
196 template <class Col>
197 explicit FeatureBitset(Col const& fs)
198 {
199 for (auto const& f : fs)
201 XRPL_ASSERT(
202 fs.size() == count(),
203 "ripple::FeatureBitset::FeatureBitset(Container auto) : count and "
204 "size do match");
205 }
206
207 auto
209 {
211 }
212
213 auto
214 operator[](uint256 const& f) const
215 {
217 }
218
220 set(uint256 const& f, bool value = true)
221 {
223 return *this;
224 }
225
227 reset(uint256 const& f)
228 {
230 return *this;
231 }
232
234 flip(uint256 const& f)
235 {
237 return *this;
238 }
239
242 {
243 base::operator&=(rhs);
244 return *this;
245 }
246
249 {
250 base::operator|=(rhs);
251 return *this;
252 }
253
255 operator~() const
256 {
258 }
259
260 friend FeatureBitset
261 operator&(FeatureBitset const& lhs, FeatureBitset const& rhs)
262 {
263 return FeatureBitset{
264 static_cast<base const&>(lhs) & static_cast<base const&>(rhs)};
265 }
266
267 friend FeatureBitset
268 operator&(FeatureBitset const& lhs, uint256 const& rhs)
269 {
270 return lhs & FeatureBitset{rhs};
271 }
272
273 friend FeatureBitset
274 operator&(uint256 const& lhs, FeatureBitset const& rhs)
275 {
276 return FeatureBitset{lhs} & rhs;
277 }
278
279 friend FeatureBitset
280 operator|(FeatureBitset const& lhs, FeatureBitset const& rhs)
281 {
282 return FeatureBitset{
283 static_cast<base const&>(lhs) | static_cast<base const&>(rhs)};
284 }
285
286 friend FeatureBitset
287 operator|(FeatureBitset const& lhs, uint256 const& rhs)
288 {
289 return lhs | FeatureBitset{rhs};
290 }
291
292 friend FeatureBitset
293 operator|(uint256 const& lhs, FeatureBitset const& rhs)
294 {
295 return FeatureBitset{lhs} | rhs;
296 }
297
298 friend FeatureBitset
299 operator^(FeatureBitset const& lhs, FeatureBitset const& rhs)
300 {
301 return FeatureBitset{
302 static_cast<base const&>(lhs) ^ static_cast<base const&>(rhs)};
303 }
304
305 friend FeatureBitset
306 operator^(FeatureBitset const& lhs, uint256 const& rhs)
307 {
308 return lhs ^ FeatureBitset { rhs };
309 }
310
311 friend FeatureBitset
312 operator^(uint256 const& lhs, FeatureBitset const& rhs)
313 {
314 return FeatureBitset{lhs} ^ rhs;
315 }
316
317 // set difference
318 friend FeatureBitset
319 operator-(FeatureBitset const& lhs, FeatureBitset const& rhs)
320 {
321 return lhs & ~rhs;
322 }
323
324 friend FeatureBitset
325 operator-(FeatureBitset const& lhs, uint256 const& rhs)
326 {
327 return lhs - FeatureBitset{rhs};
328 }
329
330 friend FeatureBitset
331 operator-(uint256 const& lhs, FeatureBitset const& rhs)
332 {
333 return FeatureBitset{lhs} - rhs;
334 }
335};
336
337template <class F>
338void
340{
341 for (size_t i = 0; i < bs.size(); ++i)
342 if (bs[i])
344}
345
346#pragma push_macro("XRPL_FEATURE")
347#undef XRPL_FEATURE
348#pragma push_macro("XRPL_FIX")
349#undef XRPL_FIX
350#pragma push_macro("XRPL_RETIRE")
351#undef XRPL_RETIRE
352
353#define XRPL_FEATURE(name, supported, vote) extern uint256 const feature##name;
354#define XRPL_FIX(name, supported, vote) extern uint256 const fix##name;
355#define XRPL_RETIRE(name)
356
357#include <xrpl/protocol/detail/features.macro>
358
359#undef XRPL_RETIRE
360#pragma pop_macro("XRPL_RETIRE")
361#undef XRPL_FIX
362#pragma pop_macro("XRPL_FIX")
363#undef XRPL_FEATURE
364#pragma pop_macro("XRPL_FEATURE")
365
366} // namespace ripple
367
368#endif
friend FeatureBitset operator|(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:280
friend FeatureBitset operator&(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:268
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:325
friend FeatureBitset operator|(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:293
FeatureBitset & operator|=(FeatureBitset const &rhs)
Definition: Feature.h:248
friend FeatureBitset operator^(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:306
auto operator[](uint256 const &f)
Definition: Feature.h:208
void initFromFeatures(uint256 const &f, Fs &&... fs)
Definition: Feature.h:152
friend FeatureBitset operator|(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:287
friend FeatureBitset operator&(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:274
friend FeatureBitset operator^(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:299
FeatureBitset(uint256 const &f, Fs &&... fs)
Definition: Feature.h:187
FeatureBitset operator~() const
Definition: Feature.h:255
friend FeatureBitset operator^(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:312
friend FeatureBitset operator&(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:261
friend FeatureBitset operator-(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:331
FeatureBitset & flip(uint256 const &f)
Definition: Feature.h:234
FeatureBitset(Col const &fs)
Definition: Feature.h:197
FeatureBitset & set(uint256 const &f, bool value=true)
Definition: Feature.h:220
friend FeatureBitset operator-(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:319
FeatureBitset(base const &b)
Definition: Feature.h:179
FeatureBitset & operator&=(FeatureBitset const &rhs)
Definition: Feature.h:241
FeatureBitset & reset(uint256 const &f)
Definition: Feature.h:227
auto operator[](uint256 const &f) const
Definition: Feature.h:214
static constexpr std::size_t numFeatures
Definition: Feature.h:100
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:415
AmendmentSupport
Definition: Feature.h:77
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:76
void foreachFeature(FeatureBitset bs, F &&f)
Definition: Feature.h:339