1#ifndef XRPL_PROTOCOL_FEATURE_H_INCLUDED
2#define XRPL_PROTOCOL_FEATURE_H_INCLUDED
4#include <xrpl/basics/base_uint.h>
6#include <boost/container/flat_map.hpp>
77#pragma push_macro("XRPL_FEATURE")
79#pragma push_macro("XRPL_FIX")
81#pragma push_macro("XRPL_RETIRE_FEATURE")
82#undef XRPL_RETIRE_FEATURE
83#pragma push_macro("XRPL_RETIRE_FIX")
86#define XRPL_FEATURE(name, supported, vote) +1
87#define XRPL_FIX(name, supported, vote) +1
88#define XRPL_RETIRE_FEATURE(name) +1
89#define XRPL_RETIRE_FIX(name) +1
97#include <xrpl/protocol/detail/features.macro>
100#undef XRPL_RETIRE_FEATURE
101#pragma pop_macro("XRPL_RETIRE_FEATURE")
102#undef XRPL_RETIRE_FIX
103#pragma pop_macro("XRPL_RETIRE_FIX")
105#pragma pop_macro("XRPL_FIX")
107#pragma pop_macro("XRPL_FEATURE")
147 template <
class... Fs>
152 if constexpr (
sizeof...(fs) > 0)
158 using base::operator==;
169 using base::operator[];
180 "ripple::FeatureBitset::FeatureBitset(base) : count match");
183 template <
class... Fs>
188 count() == (
sizeof...(fs) + 1),
189 "ripple::FeatureBitset::FeatureBitset(uint256) : count and "
190 "sizeof... do match");
196 for (
auto const& f : fs)
199 fs.size() ==
count(),
200 "ripple::FeatureBitset::FeatureBitset(Container auto) : count and "
261 static_cast<base const&
>(lhs) &
static_cast<base const&
>(rhs)};
280 static_cast<base const&
>(lhs) |
static_cast<base const&
>(rhs)};
299 static_cast<base const&
>(lhs) ^
static_cast<base const&
>(rhs)};
338 for (
size_t i = 0; i < bs.
size(); ++i)
343#pragma push_macro("XRPL_FEATURE")
345#pragma push_macro("XRPL_FIX")
347#pragma push_macro("XRPL_RETIRE_FEATURE")
348#undef XRPL_RETIRE_FEATURE
349#pragma push_macro("XRPL_RETIRE_FIX")
350#undef XRPL_RETIRE_FIX
352#define XRPL_FEATURE(name, supported, vote) extern uint256 const feature##name;
353#define XRPL_FIX(name, supported, vote) extern uint256 const fix##name;
354#define XRPL_RETIRE_FEATURE(name)
355#define XRPL_RETIRE_FIX(name)
357#include <xrpl/protocol/detail/features.macro>
359#undef XRPL_RETIRE_FEATURE
360#pragma pop_macro("XRPL_RETIRE_FEATURE")
361#undef XRPL_RETIRE_FIX
362#pragma pop_macro("XRPL_RETIRE_FIX")
364#pragma pop_macro("XRPL_FIX")
366#pragma pop_macro("XRPL_FEATURE")
friend FeatureBitset operator|(FeatureBitset const &lhs, FeatureBitset const &rhs)
friend FeatureBitset operator&(FeatureBitset const &lhs, uint256 const &rhs)
friend FeatureBitset operator-(FeatureBitset const &lhs, uint256 const &rhs)
friend FeatureBitset operator|(uint256 const &lhs, FeatureBitset const &rhs)
FeatureBitset & operator|=(FeatureBitset const &rhs)
friend FeatureBitset operator^(FeatureBitset const &lhs, uint256 const &rhs)
auto operator[](uint256 const &f)
void initFromFeatures(uint256 const &f, Fs &&... fs)
friend FeatureBitset operator|(FeatureBitset const &lhs, uint256 const &rhs)
friend FeatureBitset operator&(uint256 const &lhs, FeatureBitset const &rhs)
friend FeatureBitset operator^(FeatureBitset const &lhs, FeatureBitset const &rhs)
FeatureBitset(uint256 const &f, Fs &&... fs)
FeatureBitset operator~() const
friend FeatureBitset operator^(uint256 const &lhs, FeatureBitset const &rhs)
friend FeatureBitset operator&(FeatureBitset const &lhs, FeatureBitset const &rhs)
friend FeatureBitset operator-(uint256 const &lhs, FeatureBitset const &rhs)
FeatureBitset & flip(uint256 const &f)
FeatureBitset(Col const &fs)
FeatureBitset & set(uint256 const &f, bool value=true)
friend FeatureBitset operator-(FeatureBitset const &lhs, FeatureBitset const &rhs)
FeatureBitset(base const &b)
FeatureBitset & operator&=(FeatureBitset const &rhs)
FeatureBitset & reset(uint256 const &f)
auto operator[](uint256 const &f) const
static constexpr std::size_t numFeatures
std::size_t numUpVotedAmendments()
Amendments that this server will vote for by default.
std::size_t numDownVotedAmendments()
Amendments that this server won't vote for by default.
std::map< std::string, VoteBehavior > const & supportedAmendments()
Amendments that this server supports and the default voting behavior.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
uint256 bitsetIndexToFeature(size_t i)
size_t featureToBitsetIndex(uint256 const &f)
std::map< std::string, AmendmentSupport > const & allAmendments()
All amendments libxrpl knows about.
std::string featureToName(uint256 const &f)
std::optional< uint256 > getRegisteredFeature(std::string const &name)
void foreachFeature(FeatureBitset bs, F &&f)