20#ifndef RIPPLE_JSON_MULTIAPIJSON_H_INCLUDED
21#define RIPPLE_JSON_MULTIAPIJSON_H_INCLUDED
23#include <xrpl/beast/utility/instrumentation.h>
24#include <xrpl/json/json_value.h>
25#include <xrpl/protocol/ApiVersion.h>
40template <
typename I, auto A>
41constexpr bool is_integral_constant<std::integral_constant<I, A>&> =
true;
42template <
typename I, auto A>
43constexpr bool is_integral_constant<std::integral_constant<I, A>
const&> =
true;
54template <
unsigned MinVer,
unsigned MaxVer>
57 static_assert(MinVer <= MaxVer);
60 valid(
unsigned int v)
noexcept ->
bool
62 return v >= MinVer && v <= MaxVer;
68 return (v < MinVer) ? 0 :
static_cast<std::size_t>(v - MinVer);
83 set(
char const* key,
auto const& v)
84 requires std::constructible_from<
Json::Value,
decltype(v)>
86 for (
auto& a : this->val)
97 for (
auto& a : this->val)
109 unsigned int Version,
112 requires std::same_as<std::remove_cvref_t<Json>,
MultiApiJson>
118 Args&&... args)
const
121 decltype(
json.val[0]),
131 std::forward<Args>(args)...);
135 template <
typename Json,
unsigned int Version,
typename Fn>
136 requires std::same_as<std::remove_cvref_t<Json>,
MultiApiJson>
155 std::convertible_to<Version, unsigned> &&
158 operator()(
Json&
json, Version version, Fn fn, Args&&... args)
const
160 invoke_result_t<Fn,
decltype(
json.val[0]), Version, Args&&...>
164 "ripple::detail::MultiApiJson::operator<Args...>() : valid "
170 std::forward<Args>(args)...);
174 template <
typename Json,
typename Version,
typename Fn>
176 std::convertible_to<Version, unsigned> &&
179 operator()(
Json&
json, Version version, Fn fn)
const
184 "ripple::detail::MultiApiJson::operator() : valid version");
192 return [self =
this](
auto... args)
195 std::declval<MultiApiJson&>(),
204 return [self =
this](
auto... args)
207 std::declval<MultiApiJson const&>(),
213 template <
typename... Args>
217 requires(
sizeof...(args) > 0) &&
223 template <
typename... Args>
227 requires(
sizeof...(args) > 0) &&
238 MultiApiJson<RPC::apiMinimumSupportedVersion, RPC::apiMaximumValidVersion>;
JSON (JavaScript Object Notation).
constexpr bool is_integral_constant
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
auto operator()(Json &json, std::integral_constant< unsigned int, Version > const version, Fn fn, Args &&... args) const -> std::invoke_result_t< Fn, decltype(json.val[0]), std::integral_constant< unsigned int, Version >, Args &&... >
auto operator()(Json &json, std::integral_constant< unsigned int, Version > const, Fn fn) const -> std::invoke_result_t< Fn, decltype(json.val[0])>
IsMemberResult isMember(char const *key) const
static constexpr std::size_t size
static constexpr struct ripple::detail::MultiApiJson::visitor_t visitor
static constexpr auto index(unsigned int v) noexcept -> std::size_t
auto visit(Args... args) -> std::invoke_result_t< visitor_t, MultiApiJson &, Args... > requires(sizeof...(args) > 0) &&
static constexpr auto valid(unsigned int v) noexcept -> bool
MultiApiJson(Json::Value const &init={})
auto visit(Args... args) const -> std::invoke_result_t< visitor_t, MultiApiJson const &, Args... > requires(sizeof...(args) > 0) &&
std::array< Json::Value, size > val
void set(char const *key, auto const &v)