mirror of
https://github.com/XRPLF/rippled.git
synced 2026-04-29 15:37:57 +00:00
This change refactors the codebase to use the "east const convention", and adds a clang-format rule to follow this convention.
158 lines
4.6 KiB
C++
158 lines
4.6 KiB
C++
//------------------------------------------------------------------------------
|
|
/*
|
|
This file is part of rippled: https://github.com/ripple/rippled
|
|
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
//==============================================================================
|
|
|
|
#include <xrpl/protocol/SField.h>
|
|
|
|
#include <map>
|
|
#include <string>
|
|
|
|
namespace ripple {
|
|
|
|
// Storage for static const members.
|
|
SField::IsSigning const SField::notSigning;
|
|
int SField::num = 0;
|
|
std::map<int, SField const*> SField::knownCodeToField;
|
|
|
|
// Give only this translation unit permission to construct SFields
|
|
struct SField::private_access_tag_t
|
|
{
|
|
explicit private_access_tag_t() = default;
|
|
};
|
|
|
|
static SField::private_access_tag_t access;
|
|
|
|
template <class T>
|
|
template <class... Args>
|
|
TypedField<T>::TypedField(private_access_tag_t pat, Args&&... args)
|
|
: SField(pat, std::forward<Args>(args)...)
|
|
{
|
|
}
|
|
|
|
// Construct all compile-time SFields, and register them in the knownCodeToField
|
|
// database:
|
|
|
|
// Use macros for most SField construction to enforce naming conventions.
|
|
#pragma push_macro("UNTYPED_SFIELD")
|
|
#undef UNTYPED_SFIELD
|
|
#pragma push_macro("TYPED_SFIELD")
|
|
#undef TYPED_SFIELD
|
|
|
|
#define UNTYPED_SFIELD(sfName, stiSuffix, fieldValue, ...) \
|
|
SField const sfName( \
|
|
access, \
|
|
STI_##stiSuffix, \
|
|
fieldValue, \
|
|
std::string_view(#sfName).substr(2).data(), \
|
|
##__VA_ARGS__);
|
|
#define TYPED_SFIELD(sfName, stiSuffix, fieldValue, ...) \
|
|
SF_##stiSuffix const sfName( \
|
|
access, \
|
|
STI_##stiSuffix, \
|
|
fieldValue, \
|
|
std::string_view(#sfName).substr(2).data(), \
|
|
##__VA_ARGS__);
|
|
|
|
// SFields which, for historical reasons, do not follow naming conventions.
|
|
SField const sfInvalid(access, -1);
|
|
SField const sfGeneric(access, 0);
|
|
// The following two fields aren't used anywhere, but they break tests/have
|
|
// downstream effects.
|
|
SField const sfHash(access, STI_UINT256, 257, "hash");
|
|
SField const sfIndex(access, STI_UINT256, 258, "index");
|
|
|
|
#include <xrpl/protocol/detail/sfields.macro>
|
|
|
|
#undef TYPED_SFIELD
|
|
#pragma pop_macro("TYPED_SFIELD")
|
|
#undef UNTYPED_SFIELD
|
|
#pragma pop_macro("UNTYPED_SFIELD")
|
|
|
|
SField::SField(
|
|
private_access_tag_t,
|
|
SerializedTypeID tid,
|
|
int fv,
|
|
char const* fn,
|
|
int meta,
|
|
IsSigning signing)
|
|
: fieldCode(field_code(tid, fv))
|
|
, fieldType(tid)
|
|
, fieldValue(fv)
|
|
, fieldName(fn)
|
|
, fieldMeta(meta)
|
|
, fieldNum(++num)
|
|
, signingField(signing)
|
|
, jsonName(fieldName.c_str())
|
|
{
|
|
knownCodeToField[fieldCode] = this;
|
|
}
|
|
|
|
SField::SField(private_access_tag_t, int fc)
|
|
: fieldCode(fc)
|
|
, fieldType(STI_UNKNOWN)
|
|
, fieldValue(0)
|
|
, fieldMeta(sMD_Never)
|
|
, fieldNum(++num)
|
|
, signingField(IsSigning::yes)
|
|
, jsonName(fieldName.c_str())
|
|
{
|
|
knownCodeToField[fieldCode] = this;
|
|
}
|
|
|
|
SField const&
|
|
SField::getField(int code)
|
|
{
|
|
auto it = knownCodeToField.find(code);
|
|
|
|
if (it != knownCodeToField.end())
|
|
{
|
|
return *(it->second);
|
|
}
|
|
return sfInvalid;
|
|
}
|
|
|
|
int
|
|
SField::compare(SField const& f1, SField const& f2)
|
|
{
|
|
// -1 = f1 comes before f2, 0 = illegal combination, 1 = f1 comes after f2
|
|
if ((f1.fieldCode <= 0) || (f2.fieldCode <= 0))
|
|
return 0;
|
|
|
|
if (f1.fieldCode < f2.fieldCode)
|
|
return -1;
|
|
|
|
if (f2.fieldCode < f1.fieldCode)
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
SField const&
|
|
SField::getField(std::string const& fieldName)
|
|
{
|
|
for (auto const& [_, f] : knownCodeToField)
|
|
{
|
|
(void)_;
|
|
if (f->fieldName == fieldName)
|
|
return *f;
|
|
}
|
|
return sfInvalid;
|
|
}
|
|
|
|
} // namespace ripple
|