Use Json::StaticString for field names

Clean up some code relating to unknown fields and avoid
allocate/copy/free cycles for Json objects containing
serialized field names.
This commit is contained in:
JoelKatz
2018-08-07 13:30:52 -07:00
committed by Nik Bougalis
parent 8c1123edc6
commit b6363289bf
4 changed files with 44 additions and 49 deletions

View File

@@ -277,7 +277,7 @@ SField::SField (SerializedTypeID tid, int fv, const char* fn,
, fieldMeta (meta)
, fieldNum (++num)
, signingField (signing)
, jsonName (getName ())
, jsonName (fieldName.c_str())
{
}
@@ -288,7 +288,7 @@ SField::SField (int fc)
, fieldMeta (sMD_Never)
, fieldNum (++num)
, signingField (IsSigning::yes)
, jsonName (getName ())
, jsonName (fieldName.c_str())
{
}
@@ -296,18 +296,31 @@ SField::SField (int fc)
// This is naturally done with no extra expense
// from getField(int code).
SField::SField (SerializedTypeID tid, int fv)
: fieldCode (field_code (tid, fv))
, fieldType (tid)
, fieldValue (fv)
, fieldMeta (sMD_Default)
, fieldNum (++num)
, signingField (IsSigning::yes)
: fieldCode (field_code (tid, fv))
, fieldType (tid)
, fieldValue (fv)
, fieldName (std::to_string (tid) + '/' + std::to_string (fv))
, fieldMeta (sMD_Default)
, fieldNum (++num)
, signingField (IsSigning::yes)
, jsonName (fieldName.c_str())
{
fieldName = std::to_string (tid) + '/' + std::to_string (fv);
jsonName = getName ();
assert ((fv != 1) || ((tid != STI_ARRAY) && (tid != STI_OBJECT)));
}
// we can't use the default move constructor because
// it could leave jsonName referencing a destroyed string
SField::SField (SField &&s)
: fieldCode (s.fieldCode)
, fieldType (s.fieldType)
, fieldValue (s.fieldValue)
, fieldMeta (s.fieldMeta)
, fieldNum (s.fieldNum)
, signingField (s.signingField)
, jsonName (fieldName.c_str())
{
}
SField const&
SField::getField (int code)
{
@@ -380,18 +393,6 @@ int SField::compare (SField const& f1, SField const& f2)
return 0;
}
std::string SField::getName () const
{
if (!fieldName.empty ())
return fieldName;
if (fieldValue == 0)
return "";
return std::to_string(safe_cast<int> (fieldType)) + "/" +
std::to_string(fieldValue);
}
SField const&
SField::getField (std::string const& fieldName)
{