|
|
@ -40,14 +40,14 @@ Value::Value(const std::initializer_list<Value>& values) |
|
|
|
|
|
|
|
|
|
|
|
if (!isObject) { |
|
|
|
if (!isObject) { |
|
|
|
m_type = Type::Array; |
|
|
|
m_type = Type::Array; |
|
|
|
m_value.asArray = new Array(values); |
|
|
|
m_value.array = new Array(values); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
m_type = Type::Object; |
|
|
|
m_type = Type::Object; |
|
|
|
m_value.asObject = new Object; |
|
|
|
m_value.object = new Object; |
|
|
|
|
|
|
|
|
|
|
|
for (auto& value : values) { |
|
|
|
for (auto& value : values) { |
|
|
|
m_value.asObject->emplace(std::move(*value[0].m_value.asString), |
|
|
|
m_value.object->emplace(std::move(*value[0].m_value.string), |
|
|
|
std::move(value[1])); |
|
|
|
std::move(value[1])); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -91,11 +91,11 @@ void Value::emplace_back(Value value) |
|
|
|
// Implicitly convert null to an array
|
|
|
|
// Implicitly convert null to an array
|
|
|
|
if (m_type == Type::Null) { |
|
|
|
if (m_type == Type::Null) { |
|
|
|
m_type = Type::Array; |
|
|
|
m_type = Type::Array; |
|
|
|
m_value.asArray = new Array; |
|
|
|
m_value.array = new Array; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
assert(m_type == Type::Array); |
|
|
|
assert(m_type == Type::Array); |
|
|
|
m_value.asArray->emplace_back(value); |
|
|
|
m_value.array->emplace_back(value); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Value::emplace(const std::string& key, Value value) |
|
|
|
void Value::emplace(const std::string& key, Value value) |
|
|
@ -103,11 +103,11 @@ void Value::emplace(const std::string& key, Value value) |
|
|
|
// Implicitly convert null to an object
|
|
|
|
// Implicitly convert null to an object
|
|
|
|
if (m_type == Type::Null) { |
|
|
|
if (m_type == Type::Null) { |
|
|
|
m_type = Type::Object; |
|
|
|
m_type = Type::Object; |
|
|
|
m_value.asObject = new Object; |
|
|
|
m_value.object = new Object; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
assert(m_type == Type::Object); |
|
|
|
assert(m_type == Type::Object); |
|
|
|
m_value.asObject->emplace(key, value); |
|
|
|
m_value.object->emplace(key, value); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool Value::exists(size_t index) const |
|
|
|
bool Value::exists(size_t index) const |
|
|
@ -118,7 +118,7 @@ bool Value::exists(size_t index) const |
|
|
|
bool Value::exists(const std::string& key) const |
|
|
|
bool Value::exists(const std::string& key) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
assert(m_type == Type::Object); |
|
|
|
assert(m_type == Type::Object); |
|
|
|
return m_value.asObject->members().find(key) != m_value.asObject->members().end(); |
|
|
|
return m_value.object->members().find(key) != m_value.object->members().end(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ------------------------------------------
|
|
|
|
// ------------------------------------------
|
|
|
@ -128,11 +128,11 @@ Value& Value::operator[](size_t index) |
|
|
|
// Implicitly convert null to an array
|
|
|
|
// Implicitly convert null to an array
|
|
|
|
if (m_type == Type::Null) { |
|
|
|
if (m_type == Type::Null) { |
|
|
|
m_type = Type::Array; |
|
|
|
m_type = Type::Array; |
|
|
|
m_value.asArray = new Array; |
|
|
|
m_value.array = new Array; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
assert(m_type == Type::Array); |
|
|
|
assert(m_type == Type::Array); |
|
|
|
return (*m_value.asArray)[index]; |
|
|
|
return (*m_value.array)[index]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Value& Value::operator[](const std::string& key) |
|
|
|
Value& Value::operator[](const std::string& key) |
|
|
@ -140,47 +140,47 @@ Value& Value::operator[](const std::string& key) |
|
|
|
// Implicitly convert null to an object
|
|
|
|
// Implicitly convert null to an object
|
|
|
|
if (m_type == Type::Null) { |
|
|
|
if (m_type == Type::Null) { |
|
|
|
m_type = Type::Object; |
|
|
|
m_type = Type::Object; |
|
|
|
m_value.asObject = new Object; |
|
|
|
m_value.object = new Object; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
assert(m_type == Type::Object); |
|
|
|
assert(m_type == Type::Object); |
|
|
|
return (*m_value.asObject)[key]; |
|
|
|
return (*m_value.object)[key]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const Value& Value::operator[](size_t index) const |
|
|
|
const Value& Value::operator[](size_t index) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
assert(m_type == Type::Array); |
|
|
|
assert(m_type == Type::Array); |
|
|
|
return (*m_value.asArray)[index]; |
|
|
|
return (*m_value.array)[index]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const Value& Value::operator[](const std::string& key) const |
|
|
|
const Value& Value::operator[](const std::string& key) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
assert(m_type == Type::Object); |
|
|
|
assert(m_type == Type::Object); |
|
|
|
return (*m_value.asObject)[key]; |
|
|
|
return (*m_value.object)[key]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Value& Value::at(size_t index) |
|
|
|
Value& Value::at(size_t index) |
|
|
|
{ |
|
|
|
{ |
|
|
|
assert(m_type == Type::Array); |
|
|
|
assert(m_type == Type::Array); |
|
|
|
return m_value.asArray->at(index); |
|
|
|
return m_value.array->at(index); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Value& Value::at(const std::string& key) |
|
|
|
Value& Value::at(const std::string& key) |
|
|
|
{ |
|
|
|
{ |
|
|
|
assert(m_type == Type::Object); |
|
|
|
assert(m_type == Type::Object); |
|
|
|
return m_value.asObject->at(key); |
|
|
|
return m_value.object->at(key); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const Value& Value::at(size_t index) const |
|
|
|
const Value& Value::at(size_t index) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
assert(m_type == Type::Array); |
|
|
|
assert(m_type == Type::Array); |
|
|
|
return m_value.asArray->at(index); |
|
|
|
return m_value.array->at(index); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const Value& Value::at(const std::string& key) const |
|
|
|
const Value& Value::at(const std::string& key) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
assert(m_type == Type::Object); |
|
|
|
assert(m_type == Type::Object); |
|
|
|
return m_value.asObject->at(key); |
|
|
|
return m_value.object->at(key); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ------------------------------------------
|
|
|
|
// ------------------------------------------
|
|
|
@ -195,9 +195,9 @@ size_t Value::size() const |
|
|
|
case Type::String: |
|
|
|
case Type::String: |
|
|
|
return 1; |
|
|
|
return 1; |
|
|
|
case Type::Array: |
|
|
|
case Type::Array: |
|
|
|
return m_value.asArray->size(); |
|
|
|
return m_value.array->size(); |
|
|
|
case Type::Object: |
|
|
|
case Type::Object: |
|
|
|
return m_value.asObject->size(); |
|
|
|
return m_value.object->size(); |
|
|
|
default: |
|
|
|
default: |
|
|
|
return 1; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
} |
|
|
@ -209,19 +209,19 @@ void Value::create() |
|
|
|
{ |
|
|
|
{ |
|
|
|
switch (m_type) { |
|
|
|
switch (m_type) { |
|
|
|
case Type::Bool: |
|
|
|
case Type::Bool: |
|
|
|
m_value.asBool = false; |
|
|
|
m_value.boolean = false; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case Type::Number: |
|
|
|
case Type::Number: |
|
|
|
m_value.asDouble = 0.0; |
|
|
|
m_value.number = 0.0; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case Type::String: |
|
|
|
case Type::String: |
|
|
|
m_value.asString = new std::string; |
|
|
|
m_value.string = new std::string; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case Type::Array: |
|
|
|
case Type::Array: |
|
|
|
m_value.asArray = new Array; |
|
|
|
m_value.array = new Array; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case Type::Object: |
|
|
|
case Type::Object: |
|
|
|
m_value.asObject = new Object; |
|
|
|
m_value.object = new Object; |
|
|
|
break; |
|
|
|
break; |
|
|
|
default: |
|
|
|
default: |
|
|
|
break; |
|
|
|
break; |
|
|
@ -232,13 +232,13 @@ void Value::clear() |
|
|
|
{ |
|
|
|
{ |
|
|
|
switch (m_type) { |
|
|
|
switch (m_type) { |
|
|
|
case Type::String: |
|
|
|
case Type::String: |
|
|
|
delete m_value.asString; |
|
|
|
delete m_value.string; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case Type::Array: |
|
|
|
case Type::Array: |
|
|
|
delete m_value.asArray; |
|
|
|
delete m_value.array; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case Type::Object: |
|
|
|
case Type::Object: |
|
|
|
delete m_value.asObject; |
|
|
|
delete m_value.object; |
|
|
|
break; |
|
|
|
break; |
|
|
|
default: |
|
|
|
default: |
|
|
|
break; |
|
|
|
break; |
|
|
@ -251,19 +251,19 @@ void Value::copyFrom(const Value& other) |
|
|
|
|
|
|
|
|
|
|
|
switch (m_type) { |
|
|
|
switch (m_type) { |
|
|
|
case Type::Bool: |
|
|
|
case Type::Bool: |
|
|
|
m_value.asBool = other.m_value.asBool; |
|
|
|
m_value.boolean = other.m_value.boolean; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case Type::Number: |
|
|
|
case Type::Number: |
|
|
|
m_value.asDouble = other.m_value.asDouble; |
|
|
|
m_value.number = other.m_value.number; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case Type::String: |
|
|
|
case Type::String: |
|
|
|
m_value.asString = new std::string(*other.m_value.asString); |
|
|
|
m_value.string = new std::string(*other.m_value.string); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case Type::Array: |
|
|
|
case Type::Array: |
|
|
|
m_value.asArray = new Array(*other.m_value.asArray); |
|
|
|
m_value.array = new Array(*other.m_value.array); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case Type::Object: |
|
|
|
case Type::Object: |
|
|
|
m_value.asObject = new Object(*other.m_value.asObject); |
|
|
|
m_value.object = new Object(*other.m_value.object); |
|
|
|
break; |
|
|
|
break; |
|
|
|
default: |
|
|
|
default: |
|
|
|
break; |
|
|
|
break; |
|
|
|