Files
EHS/src/json/JsonArray.cpp
karutoh 1a4a1ecd9c
Some checks failed
Build & Release / Linux-x86_64-Build (push) Successful in 40s
Build & Release / Linux-AARCH64-Build (push) Has been cancelled
First commit.
2024-01-31 22:28:19 -08:00

528 lines
10 KiB
C++

#include "ehs/json/JsonArray.h"
#include "ehs/json/JsonObj.h"
#include "ehs/json/JsonBool.h"
#include "ehs/json/JsonNum.h"
#include "ehs/json/JsonStr.h"
namespace ehs
{
JsonArray::~JsonArray()
{
for (UInt_64 i = 0; i < size; ++i)
delete data[i];
delete[] data;
}
JsonArray::JsonArray()
: JsonBase(JsonType::ARRAY), size(0), extra(0), rawSize(0), data(nullptr)
{
}
JsonArray::JsonArray(const UInt_64 extra)
: JsonBase(JsonType::ARRAY), size(0), extra(extra), rawSize(extra), data(new JsonBase*[rawSize])
{
}
JsonArray::JsonArray(const UInt_64 size, const UInt_64 extra)
: JsonBase(JsonType::ARRAY), size(size), extra(extra), rawSize(size + extra), data(new JsonBase*[rawSize])
{
}
JsonArray::JsonArray(JsonArray&& ja) noexcept
: JsonBase(ja), size(ja.size), extra(ja.extra), rawSize(ja.rawSize), data(ja.data)
{
ja.size = 0;
ja.extra = 0;
ja.rawSize = 0;
ja.data = nullptr;
}
JsonArray::JsonArray(const JsonArray& ja)
: JsonBase(ja), size(ja.size), extra(ja.extra), rawSize(ja.rawSize), data(new JsonBase*[ja.rawSize])
{
for (UInt_64 i = 0; i < size; ++i)
{
switch (ja.data[i]->GetType())
{
case JsonType::OBJ:
data[i] = (JsonBase*)new JsonObj(*(JsonObj*)ja.data[i]);
break;
case JsonType::ARRAY:
data[i] = (JsonBase*)new JsonArray(*(JsonArray*)ja.data[i]);
break;
case JsonType::BOOL:
data[i] = (JsonBase*)new JsonBool(*(JsonBool*)ja.data[i]);
break;
case JsonType::NUM:
data[i] = (JsonBase*)new JsonNum(*(JsonNum*)ja.data[i]);
break;
case JsonType::STR:
data[i] = (JsonBase*)new JsonStr(*(JsonStr*)ja.data[i]);
break;
default:
data[i] = new JsonBase();
break;
}
}
}
JsonArray& JsonArray::operator=(JsonArray&& ja) noexcept
{
if (this == &ja)
return *this;
JsonBase::operator=(ja);
size = ja.size;
extra = ja.extra;
rawSize = ja.rawSize;
delete[] data;
data = ja.data;
ja.size = 0;
ja.extra = 0;
ja.rawSize = 0;
ja.data = nullptr;
return *this;
}
JsonArray& JsonArray::operator=(const JsonArray& ja)
{
if (this == &ja)
return *this;
JsonBase::operator=(ja);
size = ja.size;
extra = ja.size;
rawSize = ja.rawSize;
delete[] data;
data = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < ja.size; ++i)
{
switch (ja.data[i]->GetType())
{
case JsonType::OBJ:
data[i] = (JsonBase*)new JsonObj(*(JsonObj*)ja.data[i]);
break;
case JsonType::ARRAY:
data[i] = (JsonBase*)new JsonArray(*(JsonArray*)ja.data[i]);
break;
case JsonType::BOOL:
data[i] = (JsonBase*)new JsonBool(*(JsonBool*)ja.data[i]);
break;
case JsonType::NUM:
data[i] = (JsonBase*)new JsonNum(*(JsonNum*)ja.data[i]);
break;
case JsonType::STR:
data[i] = (JsonBase*)new JsonStr(*(JsonStr*)ja.data[i]);
break;
default:
data[i] = new JsonBase(JsonType::NULLOBJ);
break;
}
}
return *this;
}
JsonArray::operator JsonBase* const *() const
{
return data;
}
JsonArray::operator JsonBase**()
{
return data;
}
UInt_64 JsonArray::RawSize() const
{
return rawSize;
}
UInt_64 JsonArray::Extra() const
{
return extra;
}
UInt_64 JsonArray::Size() const
{
return size;
}
void JsonArray::Insert(const UInt_64 index, const JsonBase* const value)
{
if (size + 1 >= rawSize)
rawSize = size + extra;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < index; ++i)
result[i] = data[i];
switch (value->GetType())
{
case JsonType::OBJ:
result[index] = (JsonBase*)new JsonObj(*(JsonObj*)value);
break;
case JsonType::ARRAY:
result[index] = (JsonBase*)new JsonArray(*(JsonArray*)value);
break;
case JsonType::BOOL:
result[index] = (JsonBase*)new JsonBool(*(JsonBool*)value);
break;
case JsonType::NUM:
result[index] = (JsonBase*)new JsonNum(*(JsonNum*)value);
break;
case JsonType::STR:
result[index] = (JsonBase*)new JsonStr(*(JsonStr*)value);
break;
default:
result[index] = new JsonBase(JsonType::NULLOBJ);
break;
}
for (UInt_64 i = index; i < size; ++i)
result[i + 1] = data[i];
delete[] data;
data = result;
++size;
}
void JsonArray::Push(const JsonBase* const value)
{
if (size + 1 > rawSize)
{
rawSize = size + extra + 1;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < size; ++i)
result[i] = data[i];
switch (value->GetType())
{
case JsonType::OBJ:
result[size++] = (JsonBase*)new JsonObj(*(JsonObj*)value);
break;
case JsonType::ARRAY:
result[size++] = (JsonBase*)new JsonArray(*(JsonArray*)value);
break;
case JsonType::BOOL:
result[size++] = (JsonBase*)new JsonBool(*(JsonBool*)value);
break;
case JsonType::NUM:
result[size++] = (JsonBase*)new JsonNum(*(JsonNum*)value);
break;
case JsonType::STR:
result[size++] = (JsonBase*)new JsonStr(*(JsonStr*)value);
break;
default:
result[size++] = new JsonBase(JsonType::NULLOBJ);
break;
}
delete[] data;
data = result;
}
else
{
switch (value->GetType())
{
case JsonType::OBJ:
data[size++] = (JsonBase*)new JsonObj(*(JsonObj*)value);
break;
case JsonType::ARRAY:
data[size++] = (JsonBase*)new JsonArray(*(JsonArray*)value);
break;
case JsonType::BOOL:
data[size++] = (JsonBase*)new JsonBool(*(JsonBool*)value);
break;
case JsonType::NUM:
data[size++] = (JsonBase*)new JsonNum(*(JsonNum*)value);
break;
case JsonType::STR:
data[size++] = (JsonBase*)new JsonStr(*(JsonStr*)value);
break;
default:
data[size++] = new JsonBase(JsonType::NULLOBJ);
break;
}
}
}
void JsonArray::Push(const JsonBase& value)
{
if (size + 1 > rawSize)
{
rawSize = size + extra + 1;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < size; ++i)
result[i] = data[i];
result[size++] = new JsonBase(value);
delete[] data;
data = result;
}
else
{
data[size++] = new JsonBase(value);
}
}
void JsonArray::Push(const JsonObj& value)
{
if (size + 1 > rawSize)
{
rawSize = size + extra + 1;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < size; ++i)
result[i] = data[i];
result[size++] = (JsonBase*)new JsonObj(value);
delete[] data;
data = result;
}
else
{
data[size++] = (JsonBase*)new JsonObj(value);
}
}
void JsonArray::Push(const JsonArray& value)
{
if (size + 1 > rawSize)
{
rawSize = size + extra + 1;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < size; ++i)
result[i] = data[i];
result[size++] = (JsonBase*)new JsonArray(value);
delete[] data;
data = result;
}
else
{
data[size++] = (JsonBase*)new JsonArray(value);
}
}
void JsonArray::Push(const JsonBool& value)
{
if (size + 1 > rawSize)
{
rawSize = size + extra + 1;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < size; ++i)
result[i] = data[i];
result[size++] = (JsonBase*)new JsonBool(value);
delete[] data;
data = result;
}
else
{
data[size++] = (JsonBase*)new JsonBool(value);
}
}
void JsonArray::Push(const bool value)
{
if (size + 1 > rawSize)
{
rawSize = size + extra + 1;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < size; ++i)
result[i] = data[i];
result[size++] = (JsonBase*)new JsonBool(value);
delete[] data;
data = result;
}
else
{
data[size++] = (JsonBase*)new JsonBool(value);
}
}
void JsonArray::Push(const JsonNum& value)
{
if (size + 1 > rawSize)
{
rawSize = size + extra + 1;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < size; ++i)
result[i] = data[i];
result[size++] = (JsonBase*)new JsonNum(value);
delete[] data;
data = result;
}
else
{
data[size++] = (JsonBase*)new JsonNum(value);
}
}
void JsonArray::Push(const float value)
{
if (size + 1 > rawSize)
{
rawSize = size + extra + 1;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < size; ++i)
result[i] = data[i];
result[size++] = (JsonBase*)new JsonNum(value);
delete[] data;
data = result;
}
else
{
data[size++] = (JsonBase*)new JsonNum(value);
}
}
void JsonArray::Push(const JsonStr& value)
{
if (size + 1 > rawSize)
{
rawSize = size + extra + 1;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < size; ++i)
result[i] = data[i];
result[size++] = (JsonBase*)new JsonStr(value);
delete[] data;
data = result;
}
else
{
data[size++] = (JsonBase*)new JsonStr(value);
}
}
void JsonArray::Push(const Char_8* value, const UInt_64 size)
{
if (this->size + 1 > rawSize)
{
rawSize = this->size + extra + 1;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < this->size; ++i)
result[i] = data[i];
result[this->size++] = (JsonBase*)new JsonStr(Str_8(value, size));
delete[] data;
data = result;
}
else
{
data[this->size++] = (JsonBase*)new JsonStr(Str_8(value, size));
}
}
void JsonArray::Push(const Str_8& value)
{
if (this->size + 1 > rawSize)
{
rawSize = this->size + extra + 1;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < this->size; ++i)
result[i] = data[i];
result[this->size++] = (JsonBase*)new JsonStr(value);
delete[] data;
data = result;
}
else
{
data[this->size++] = (JsonBase*)new JsonStr(value);
}
}
void JsonArray::Pop()
{
if (rawSize - --size >= extra * 2)
rawSize -= extra;
JsonBase** result = new JsonBase*[rawSize];
for (UInt_64 i = 0; i < size; ++i)
result[i] = data[i];
delete[] data;
data = result;
}
Str_8 JsonArray::ToStr(const UInt_64 level, const bool compact) const
{
Str_8 result = "[";
if (!compact)
result += "\r\n";
for (UInt_64 i = 0; i < size; ++i)
{
if (!compact && (data[i]->GetType() == JsonType::OBJ || data[i]->GetType() == JsonType::ARRAY))
{
for (UInt_64 l = 0; l < level + 1; ++l)
result += "\t";
}
result += data[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;
}
}