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
70namespace ripple {
71
72enum class VoteBehavior : int { Obsolete = -1, DefaultNo = 0, DefaultYes };
73enum class AmendmentSupport : int { Retired = -1, Supported = 0, Unsupported };
74
78
79namespace detail {
80
81// This value SHOULD be equal to the number of amendments registered in
82// Feature.cpp. Because it's only used to reserve storage, and determine how
83// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
84// the actual number of amendments. A LogicError on startup will verify this.
85static constexpr std::size_t numFeatures = 88;
86
92
99
106
107} // namespace detail
108
111
112size_t
114
116bitsetIndexToFeature(size_t i);
117
119featureToName(uint256 const& f);
120
121class FeatureBitset : private std::bitset<detail::numFeatures>
122{
124
125 template <class... Fs>
126 void
127 initFromFeatures(uint256 const& f, Fs&&... fs)
128 {
129 set(f);
130 if constexpr (sizeof...(fs) > 0)
131 initFromFeatures(std::forward<Fs>(fs)...);
132 }
133
134public:
135 using base::bitset;
136 using base::operator==;
137
138 using base::all;
139 using base::any;
140 using base::count;
141 using base::flip;
142 using base::none;
143 using base::reset;
144 using base::set;
145 using base::size;
146 using base::test;
147 using base::operator[];
148 using base::to_string;
149 using base::to_ullong;
150 using base::to_ulong;
151
152 FeatureBitset() = default;
153
154 explicit FeatureBitset(base const& b) : base(b)
155 {
156 XRPL_ASSERT(
157 b.count() == count(),
158 "ripple::FeatureBitset::FeatureBitset(base) : count match");
159 }
160
161 template <class... Fs>
162 explicit FeatureBitset(uint256 const& f, Fs&&... fs)
163 {
164 initFromFeatures(f, std::forward<Fs>(fs)...);
165 XRPL_ASSERT(
166 count() == (sizeof...(fs) + 1),
167 "ripple::FeatureBitset::FeatureBitset(uint256) : count and "
168 "sizeof... do match");
169 }
170
171 template <class Col>
172 explicit FeatureBitset(Col const& fs)
173 {
174 for (auto const& f : fs)
176 XRPL_ASSERT(
177 fs.size() == count(),
178 "ripple::FeatureBitset::FeatureBitset(Container auto) : count and "
179 "size do match");
180 }
181
182 auto
184 {
186 }
187
188 auto
189 operator[](uint256 const& f) const
190 {
192 }
193
195 set(uint256 const& f, bool value = true)
196 {
198 return *this;
199 }
200
202 reset(uint256 const& f)
203 {
205 return *this;
206 }
207
209 flip(uint256 const& f)
210 {
212 return *this;
213 }
214
217 {
218 base::operator&=(rhs);
219 return *this;
220 }
221
224 {
225 base::operator|=(rhs);
226 return *this;
227 }
228
230 operator~() const
231 {
233 }
234
235 friend FeatureBitset
236 operator&(FeatureBitset const& lhs, FeatureBitset const& rhs)
237 {
238 return FeatureBitset{
239 static_cast<base const&>(lhs) & static_cast<base const&>(rhs)};
240 }
241
242 friend FeatureBitset
243 operator&(FeatureBitset const& lhs, uint256 const& rhs)
244 {
245 return lhs & FeatureBitset{rhs};
246 }
247
248 friend FeatureBitset
249 operator&(uint256 const& lhs, FeatureBitset const& rhs)
250 {
251 return FeatureBitset{lhs} & rhs;
252 }
253
254 friend FeatureBitset
255 operator|(FeatureBitset const& lhs, FeatureBitset const& rhs)
256 {
257 return FeatureBitset{
258 static_cast<base const&>(lhs) | static_cast<base const&>(rhs)};
259 }
260
261 friend FeatureBitset
262 operator|(FeatureBitset const& lhs, uint256 const& rhs)
263 {
264 return lhs | FeatureBitset{rhs};
265 }
266
267 friend FeatureBitset
268 operator|(uint256 const& lhs, FeatureBitset const& rhs)
269 {
270 return FeatureBitset{lhs} | rhs;
271 }
272
273 friend FeatureBitset
274 operator^(FeatureBitset const& lhs, FeatureBitset const& rhs)
275 {
276 return FeatureBitset{
277 static_cast<base const&>(lhs) ^ static_cast<base const&>(rhs)};
278 }
279
280 friend FeatureBitset
281 operator^(FeatureBitset const& lhs, uint256 const& rhs)
282 {
283 return lhs ^ FeatureBitset { rhs };
284 }
285
286 friend FeatureBitset
287 operator^(uint256 const& lhs, FeatureBitset const& rhs)
288 {
289 return FeatureBitset{lhs} ^ rhs;
290 }
291
292 // set difference
293 friend FeatureBitset
294 operator-(FeatureBitset const& lhs, FeatureBitset const& rhs)
295 {
296 return lhs & ~rhs;
297 }
298
299 friend FeatureBitset
300 operator-(FeatureBitset const& lhs, uint256 const& rhs)
301 {
302 return lhs - FeatureBitset{rhs};
303 }
304
305 friend FeatureBitset
306 operator-(uint256 const& lhs, FeatureBitset const& rhs)
307 {
308 return FeatureBitset{lhs} - rhs;
309 }
310};
311
312template <class F>
313void
315{
316 for (size_t i = 0; i < bs.size(); ++i)
317 if (bs[i])
319}
320
321#pragma push_macro("XRPL_FEATURE")
322#undef XRPL_FEATURE
323#pragma push_macro("XRPL_FIX")
324#undef XRPL_FIX
325
326#define XRPL_FEATURE(name, supported, vote) extern uint256 const feature##name;
327#define XRPL_FIX(name, supported, vote) extern uint256 const fix##name;
328
329#include <xrpl/protocol/detail/features.macro>
330
331#undef XRPL_FIX
332#pragma pop_macro("XRPL_FIX")
333#undef XRPL_FEATURE
334#pragma pop_macro("XRPL_FEATURE")
335
336} // namespace ripple
337
338#endif
friend FeatureBitset operator|(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:255
friend FeatureBitset operator&(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:243
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:300
friend FeatureBitset operator|(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:268
FeatureBitset & operator|=(FeatureBitset const &rhs)
Definition: Feature.h:223
friend FeatureBitset operator^(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:281
auto operator[](uint256 const &f)
Definition: Feature.h:183
void initFromFeatures(uint256 const &f, Fs &&... fs)
Definition: Feature.h:127
friend FeatureBitset operator|(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:262
friend FeatureBitset operator&(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:249
friend FeatureBitset operator^(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:274
FeatureBitset(uint256 const &f, Fs &&... fs)
Definition: Feature.h:162
FeatureBitset operator~() const
Definition: Feature.h:230
friend FeatureBitset operator^(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:287
friend FeatureBitset operator&(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:236
friend FeatureBitset operator-(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:306
FeatureBitset & flip(uint256 const &f)
Definition: Feature.h:209
FeatureBitset(Col const &fs)
Definition: Feature.h:172
FeatureBitset & set(uint256 const &f, bool value=true)
Definition: Feature.h:195
friend FeatureBitset operator-(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:294
FeatureBitset(base const &b)
Definition: Feature.h:154
FeatureBitset & operator&=(FeatureBitset const &rhs)
Definition: Feature.h:216
FeatureBitset & reset(uint256 const &f)
Definition: Feature.h:202
auto operator[](uint256 const &f) const
Definition: Feature.h:189
static constexpr std::size_t numFeatures
Definition: Feature.h:85
std::size_t numUpVotedAmendments()
Amendments that this server will vote for by default.
Definition: Feature.cpp:377
std::size_t numDownVotedAmendments()
Amendments that this server won't vote for by default.
Definition: Feature.cpp:370
std::map< std::string, VoteBehavior > const & supportedAmendments()
Amendments that this server supports and the default voting behavior.
Definition: Feature.cpp:363
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:418
AmendmentSupport
Definition: Feature.h:73
size_t featureToBitsetIndex(uint256 const &f)
Definition: Feature.cpp:412
std::map< std::string, AmendmentSupport > const & allAmendments()
All amendments libxrpl knows about.
Definition: Feature.cpp:354
std::string featureToName(uint256 const &f)
Definition: Feature.cpp:424
std::optional< uint256 > getRegisteredFeature(std::string const &name)
Definition: Feature.cpp:385
VoteBehavior
Definition: Feature.h:72
void foreachFeature(FeatureBitset bs, F &&f)
Definition: Feature.h:314