EHS/src/json/JsonObj.cpp

201 lines
3.5 KiB
C++

#include "ehs/json/JsonObj.h"
#include "ehs/json/JsonVar.h"
namespace ehs
{
JsonObj::~JsonObj()
{
delete[] vars;
}
JsonObj::JsonObj()
: JsonBase(JsonType::OBJ), size(0), extra(0), rawSize(0), vars(nullptr)
{
}
JsonObj::JsonObj(const UInt_64 size, const UInt_64 extra)
: JsonBase(JsonType::OBJ), size(size), extra(extra), rawSize(size + extra), vars(new JsonVar[size + extra])
{
}
JsonObj::JsonObj(const UInt_64 extra)
: JsonBase(JsonType::OBJ), size(0), extra(extra), rawSize(extra), vars(new JsonVar[extra])
{
}
JsonObj::JsonObj(JsonObj&& value) noexcept
: JsonBase(value), size(value.size), extra(value.extra), rawSize(value.rawSize), vars(value.vars)
{
value.size = 0;
value.extra = 0;
value.rawSize = 0;
value.vars = nullptr;
}
JsonObj::JsonObj(const JsonObj& value)
: JsonBase(value), size(value.size), extra(value.extra), rawSize(value.rawSize), vars(new JsonVar[value.rawSize])
{
for (UInt_64 i = 0; i < size; ++i)
vars[i] = value.vars[i];
}
JsonObj& JsonObj::operator=(JsonObj&& value) noexcept
{
if (this == &value)
return *this;
JsonBase::operator=(value);
size = value.size;
extra = value.extra;
rawSize = value.rawSize;
delete[] vars;
vars = value.vars;
value.size = 0;
value.extra = 0;
value.rawSize = 0;
value.vars = nullptr;
return *this;
}
JsonObj& JsonObj::operator=(const JsonObj& value)
{
if (this == &value)
return *this;
JsonBase::operator=(value);
size = value.size;
extra = value.extra;
rawSize = value.rawSize;
delete[] vars;
vars = new JsonVar[value.rawSize];
for (UInt_64 i = 0; i < value.rawSize; ++i)
vars[i] = value.vars[i];
return *this;
}
JsonObj::operator const JsonVar*() const
{
return vars;
}
JsonObj::operator JsonVar*()
{
return vars;
}
UInt_64 JsonObj::Size() const
{
return size;
}
UInt_64 JsonObj::Extra() const
{
return extra;
}
UInt_64 JsonObj::RawSize() const
{
return rawSize;
}
bool JsonObj::HasVar(const UInt_64 hashId) const
{
for (UInt_64 i = 0; i < size; ++i)
if (vars[i].GetHashId() == hashId)
return true;
return false;
}
bool JsonObj::HasVar(const Str_8& identifier) const
{
return HasVar(identifier.Hash_64());
}
bool JsonObj::AddVar(const JsonVar& var)
{
if (!var.GetHashId() || HasVar(var.GetHashId()))
return false;
if (size + 1 > rawSize)
{
rawSize += extra ? extra : 1;
JsonVar* result = new JsonVar[rawSize];
for (UInt_64 i = 0; i < size; ++i)
result[i] = vars[i];
delete[] vars;
vars = result;
}
vars[size++] = var;
return true;
}
const JsonVar* JsonObj::GetVar(const UInt_64 hashId) const
{
for (UInt_64 i = 0; i < size; ++i)
if (vars[i].GetHashId() == hashId)
return &vars[i];
return nullptr;
}
const JsonVar* JsonObj::GetVar(const Str_8& identifier) const
{
return GetVar(identifier.Hash_64());
}
JsonVar* JsonObj::GetVar(const UInt_64 hashId)
{
for (UInt_64 i = 0; i < size; ++i)
if (vars[i].GetHashId() == hashId)
return &vars[i];
return nullptr;
}
JsonVar* JsonObj::GetVar(const Str_8& identifier)
{
return GetVar(identifier.Hash_64());
}
Str_8 JsonObj::ToStr(const UInt_64 level, const bool compact) const
{
Str_8 result;
result += "{";
if (!compact)
result += "\r\n";
for (UInt_64 i = 0; i < size; ++i)
{
result += vars[i].ToStr(level + 1, compact);
if (i < size - 1)
result += ",";
if (!compact)
result += "\r\n";
}
if (!compact)
{
for (UInt_64 l = 0; l < level; ++l)
result += "\t";
}
result += "}";
return result;
}
}