rippled
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 <ripple/basics/base_uint.h>
24 #include <boost/container/flat_map.hpp>
25 #include <array>
26 #include <bitset>
27 #include <optional>
28 #include <string>
29 
67 namespace ripple {
68 
69 enum class DefaultVote : bool { no = false, yes };
70 
71 namespace detail {
72 
73 // This value SHOULD be equal to the number of amendments registered in
74 // Feature.cpp. Because it's only used to reserve storage, and determine how
75 // large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
76 // the actual number of amendments. A LogicError on startup will verify this.
77 static constexpr std::size_t numFeatures = 47;
78 
84 
91 
98 
99 } // namespace detail
100 
102 getRegisteredFeature(std::string const& name);
103 
104 size_t
105 featureToBitsetIndex(uint256 const& f);
106 
107 uint256
108 bitsetIndexToFeature(size_t i);
109 
111 featureToName(uint256 const& f);
112 
113 class FeatureBitset : private std::bitset<detail::numFeatures>
114 {
116 
117  template <class... Fs>
118  void
119  initFromFeatures(uint256 const& f, Fs&&... fs)
120  {
121  set(f);
122  if constexpr (sizeof...(fs) > 0)
123  initFromFeatures(std::forward<Fs>(fs)...);
124  }
125 
126 public:
127  using base::bitset;
128  using base::operator==;
129  using base::operator!=;
130 
131  using base::all;
132  using base::any;
133  using base::count;
134  using base::flip;
135  using base::none;
136  using base::reset;
137  using base::set;
138  using base::size;
139  using base::test;
140  using base::operator[];
141  using base::to_string;
142  using base::to_ullong;
143  using base::to_ulong;
144 
145  FeatureBitset() = default;
146 
147  explicit FeatureBitset(base const& b) : base(b)
148  {
149  assert(b.count() == count());
150  }
151 
152  template <class... Fs>
153  explicit FeatureBitset(uint256 const& f, Fs&&... fs)
154  {
155  initFromFeatures(f, std::forward<Fs>(fs)...);
156  assert(count() == (sizeof...(fs) + 1));
157  }
158 
159  template <class Col>
160  explicit FeatureBitset(Col const& fs)
161  {
162  for (auto const& f : fs)
164  assert(fs.size() == count());
165  }
166 
167  auto
168  operator[](uint256 const& f)
169  {
171  }
172 
173  auto
174  operator[](uint256 const& f) const
175  {
177  }
178 
180  set(uint256 const& f, bool value = true)
181  {
182  base::set(featureToBitsetIndex(f), value);
183  return *this;
184  }
185 
187  reset(uint256 const& f)
188  {
190  return *this;
191  }
192 
194  flip(uint256 const& f)
195  {
197  return *this;
198  }
199 
202  {
203  base::operator&=(rhs);
204  return *this;
205  }
206 
209  {
210  base::operator|=(rhs);
211  return *this;
212  }
213 
215  operator~() const
216  {
217  return FeatureBitset{base::operator~()};
218  }
219 
220  friend FeatureBitset
221  operator&(FeatureBitset const& lhs, FeatureBitset const& rhs)
222  {
223  return FeatureBitset{
224  static_cast<base const&>(lhs) & static_cast<base const&>(rhs)};
225  }
226 
227  friend FeatureBitset
228  operator&(FeatureBitset const& lhs, uint256 const& rhs)
229  {
230  return lhs & FeatureBitset{rhs};
231  }
232 
233  friend FeatureBitset
234  operator&(uint256 const& lhs, FeatureBitset const& rhs)
235  {
236  return FeatureBitset{lhs} & rhs;
237  }
238 
239  friend FeatureBitset
240  operator|(FeatureBitset const& lhs, FeatureBitset const& rhs)
241  {
242  return FeatureBitset{
243  static_cast<base const&>(lhs) | static_cast<base const&>(rhs)};
244  }
245 
246  friend FeatureBitset
247  operator|(FeatureBitset const& lhs, uint256 const& rhs)
248  {
249  return lhs | FeatureBitset{rhs};
250  }
251 
252  friend FeatureBitset
253  operator|(uint256 const& lhs, FeatureBitset const& rhs)
254  {
255  return FeatureBitset{lhs} | rhs;
256  }
257 
258  friend FeatureBitset
259  operator^(FeatureBitset const& lhs, FeatureBitset const& rhs)
260  {
261  return FeatureBitset{
262  static_cast<base const&>(lhs) ^ static_cast<base const&>(rhs)};
263  }
264 
265  friend FeatureBitset
266  operator^(FeatureBitset const& lhs, uint256 const& rhs)
267  {
268  return lhs ^ FeatureBitset { rhs };
269  }
270 
271  friend FeatureBitset
272  operator^(uint256 const& lhs, FeatureBitset const& rhs)
273  {
274  return FeatureBitset{lhs} ^ rhs;
275  }
276 
277  // set difference
278  friend FeatureBitset
279  operator-(FeatureBitset const& lhs, FeatureBitset const& rhs)
280  {
281  return lhs & ~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 
297 template <class F>
298 void
300 {
301  for (size_t i = 0; i < bs.size(); ++i)
302  if (bs[i])
303  f(bitsetIndexToFeature(i));
304 }
305 
306 extern uint256 const featureOwnerPaysFee;
307 extern uint256 const featureFlow;
308 extern uint256 const featureFlowCross;
310 extern uint256 const fix1513;
311 extern uint256 const featureDepositAuth;
312 extern uint256 const featureChecks;
313 extern uint256 const fix1571;
314 extern uint256 const fix1543;
315 extern uint256 const fix1623;
316 extern uint256 const featureDepositPreauth;
317 extern uint256 const fix1515;
318 extern uint256 const fix1578;
319 extern uint256 const featureMultiSignReserve;
320 extern uint256 const fixTakerDryOfferRemoval;
321 extern uint256 const fixMasterKeyAsRegularKey;
322 extern uint256 const fixCheckThreading;
324 extern uint256 const featureDeletableAccounts;
325 extern uint256 const fixQualityUpperBound;
327 extern uint256 const fix1781;
329 extern uint256 const fixAmendmentMajorityCalc;
330 extern uint256 const featureNegativeUNL;
331 extern uint256 const featureTicketBatch;
332 extern uint256 const featureFlowSortStrands;
333 extern uint256 const fixSTAmountCanonicalize;
337 
338 } // namespace ripple
339 
340 #endif
ripple::FeatureBitset::operator|=
FeatureBitset & operator|=(FeatureBitset const &rhs)
Definition: Feature.h:208
bitset
ripple::fixQualityUpperBound
const uint256 fixQualityUpperBound
std::string
STL class.
std::bitset< detail::numFeatures >::all
T all(T... args)
ripple::FeatureBitset::FeatureBitset
FeatureBitset()=default
ripple::fix1515
const uint256 fix1515
ripple::detail::numFeatures
static constexpr std::size_t numFeatures
Definition: Feature.h:77
ripple::featureDepositPreauth
const uint256 featureDepositPreauth
std::bitset< detail::numFeatures >::size
T size(T... args)
ripple::FeatureBitset::FeatureBitset
FeatureBitset(uint256 const &f, Fs &&... fs)
Definition: Feature.h:153
ripple::fixSTAmountCanonicalize
const uint256 fixSTAmountCanonicalize
ripple::featureDepositAuth
const uint256 featureDepositAuth
ripple::fix1781
const uint256 fix1781
ripple::featureMultiSignReserve
const uint256 featureMultiSignReserve
ripple::FeatureBitset::flip
FeatureBitset & flip(uint256 const &f)
Definition: Feature.h:194
ripple::FeatureBitset::FeatureBitset
FeatureBitset(base const &b)
Definition: Feature.h:147
std::bitset< detail::numFeatures >::to_ullong
T to_ullong(T... args)
ripple::FeatureBitset::operator^
friend FeatureBitset operator^(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:272
std::bitset< detail::numFeatures >::reset
T reset(T... args)
ripple::FeatureBitset::operator-
friend FeatureBitset operator-(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:291
ripple::uint256
base_uint< 256 > uint256
Definition: base_uint.h:543
ripple::FeatureBitset::operator|
friend FeatureBitset operator|(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:253
ripple::featureDeletableAccounts
const uint256 featureDeletableAccounts
std::bitset< detail::numFeatures >::to_ulong
T to_ulong(T... args)
ripple::FeatureBitset::operator^
friend FeatureBitset operator^(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:259
ripple::detail::numUpVotedAmendments
std::size_t numUpVotedAmendments()
Amendments that this server will vote for by default.
Definition: Feature.cpp:328
ripple::FeatureBitset::operator&
friend FeatureBitset operator&(uint256 const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:234
ripple::base_uint
Integers of any length that is a multiple of 32-bits.
Definition: base_uint.h:75
ripple::featureRequireFullyCanonicalSig
const uint256 featureRequireFullyCanonicalSig
ripple::detail::numDownVotedAmendments
std::size_t numDownVotedAmendments()
Amendments that this server won't vote for by default.
Definition: Feature.cpp:321
ripple::foreachFeature
void foreachFeature(FeatureBitset bs, F &&f)
Definition: Feature.h:299
ripple::FeatureBitset::operator&
friend FeatureBitset operator&(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:228
ripple::detail::supportedAmendments
std::map< std::string, DefaultVote > const & supportedAmendments()
Amendments that this server supports and the default voting behavior.
Definition: Feature.cpp:314
ripple::DefaultVote::yes
@ yes
ripple::fix1513
const uint256 fix1513
ripple::fixCheckThreading
const uint256 fixCheckThreading
ripple::fixAmendmentMajorityCalc
const uint256 fixAmendmentMajorityCalc
ripple::FeatureBitset::operator~
FeatureBitset operator~() const
Definition: Feature.h:215
ripple::FeatureBitset::operator|
friend FeatureBitset operator|(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:247
ripple::FeatureBitset::operator[]
auto operator[](uint256 const &f) const
Definition: Feature.h:174
ripple::fixTakerDryOfferRemoval
const uint256 fixTakerDryOfferRemoval
std::bitset< detail::numFeatures >::to_string
T to_string(T... args)
ripple::fix1623
const uint256 fix1623
array
ripple::FeatureBitset::initFromFeatures
void initFromFeatures(uint256 const &f, Fs &&... fs)
Definition: Feature.h:119
ripple::featureToBitsetIndex
size_t featureToBitsetIndex(uint256 const &f)
Definition: Feature.cpp:363
ripple::fixPayChanRecipientOwnerDir
const uint256 fixPayChanRecipientOwnerDir
ripple::fixMasterKeyAsRegularKey
const uint256 fixMasterKeyAsRegularKey
ripple::featureChecks
const uint256 featureChecks
std::map
STL class.
ripple::fixRmSmallIncreasedQOffers
const uint256 fixRmSmallIncreasedQOffers
ripple::featureFlowSortStrands
const uint256 featureFlowSortStrands
ripple::featureHardenedValidations
const uint256 featureHardenedValidations
ripple::fix1543
const uint256 fix1543
ripple::FeatureBitset::FeatureBitset
FeatureBitset(Col const &fs)
Definition: Feature.h:160
ripple::fix1578
const uint256 fix1578
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::featureNonFungibleTokensV1
const uint256 featureNonFungibleTokensV1
ripple::featureCryptoConditionsSuite
const uint256 featureCryptoConditionsSuite
ripple::featureFlow
const uint256 featureFlow
ripple::featureNegativeUNL
const uint256 featureNegativeUNL
ripple::FeatureBitset::reset
FeatureBitset & reset(uint256 const &f)
Definition: Feature.h:187
ripple::bitsetIndexToFeature
uint256 bitsetIndexToFeature(size_t i)
Definition: Feature.cpp:369
ripple::FeatureBitset::set
FeatureBitset & set(uint256 const &f, bool value=true)
Definition: Feature.h:180
ripple::FeatureBitset
Definition: Feature.h:113
std::bitset< detail::numFeatures >::count
T count(T... args)
std::bitset< detail::numFeatures >::operator&=
T operator&=(T... args)
ripple::DefaultVote
DefaultVote
Definition: Feature.h:69
ripple::FeatureBitset::operator&
friend FeatureBitset operator&(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:221
ripple::featureTicketBatch
const uint256 featureTicketBatch
optional
ripple::FeatureBitset::operator-
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:285
std::size_t
std::bitset< detail::numFeatures >::flip
T flip(T... args)
ripple::FeatureBitset::operator&=
FeatureBitset & operator&=(FeatureBitset const &rhs)
Definition: Feature.h:201
ripple::featureOwnerPaysFee
const uint256 featureOwnerPaysFee
ripple::featureCheckCashMakesTrustLine
const uint256 featureCheckCashMakesTrustLine
ripple::fix1571
const uint256 fix1571
ripple::getRegisteredFeature
std::optional< uint256 > getRegisteredFeature(std::string const &name)
Definition: Feature.cpp:336
std::bitset< detail::numFeatures >::test
T test(T... args)
ripple::FeatureBitset::operator|
friend FeatureBitset operator|(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:240
ripple::featureFlowCross
const uint256 featureFlowCross
std::bitset< detail::numFeatures >::set
T set(T... args)
ripple::FeatureBitset::operator-
friend FeatureBitset operator-(FeatureBitset const &lhs, FeatureBitset const &rhs)
Definition: Feature.h:279
std::bitset< detail::numFeatures >::operator[]
T operator[](T... args)
ripple::DefaultVote::no
@ no
ripple::FeatureBitset::operator^
friend FeatureBitset operator^(FeatureBitset const &lhs, uint256 const &rhs)
Definition: Feature.h:266
ripple::FeatureBitset::operator[]
auto operator[](uint256 const &f)
Definition: Feature.h:168
ripple::featureToName
std::string featureToName(uint256 const &f)
Definition: Feature.cpp:375
string