Commit 258f04c5 by Niels

fixed #154 (no more warnings for incomplete switches)

parent a70a7a80
...@@ -17,7 +17,7 @@ clean: ...@@ -17,7 +17,7 @@ clean:
########################################################################## ##########################################################################
# additional flags # additional flags
FLAGS = -Wall -Wextra -pedantic -Weffc++ -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-overflow=5 -Wswitch -Wundef -Wno-unused -Wnon-virtual-dtor -Wreorder -Wdeprecated -Wfloat-equal FLAGS = -Wall -Wextra -pedantic -Weffc++ -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-overflow=5 -Wswitch -Wswitch-enum -Wswitch-default -Wundef -Wno-unused -Wnon-virtual-dtor -Wreorder -Wdeprecated -Wfloat-equal
# build unit tests # build unit tests
json_unit: test/unit.cpp src/json.hpp test/catch.hpp json_unit: test/unit.cpp src/json.hpp test/catch.hpp
......
...@@ -650,47 +650,48 @@ class basic_json ...@@ -650,47 +650,48 @@ class basic_json
{ {
switch (t) switch (t)
{ {
case (value_t::null): case value_t::object:
case (value_t::discarded):
{
break;
}
case (value_t::object):
{ {
object = create<object_t>(); object = create<object_t>();
break; break;
} }
case (value_t::array): case value_t::array:
{ {
array = create<array_t>(); array = create<array_t>();
break; break;
} }
case (value_t::string): case value_t::string:
{ {
string = create<string_t>(""); string = create<string_t>("");
break; break;
} }
case (value_t::boolean): case value_t::boolean:
{ {
boolean = boolean_t(false); boolean = boolean_t(false);
break; break;
} }
case (value_t::number_integer): case value_t::number_integer:
{ {
number_integer = number_integer_t(0); number_integer = number_integer_t(0);
break; break;
} }
case (value_t::number_float): case value_t::number_float:
{ {
number_float = number_float_t(0.0); number_float = number_float_t(0.0);
break; break;
} }
case value_t::null:
case value_t::discarded:
default:
{
break;
}
} }
} }
...@@ -1481,9 +1482,9 @@ class basic_json ...@@ -1481,9 +1482,9 @@ class basic_json
// check if iterator range is complete for primitive values // check if iterator range is complete for primitive values
switch (m_type) switch (m_type)
{ {
case value_t::number_integer:
case value_t::number_float:
case value_t::boolean: case value_t::boolean:
case value_t::number_float:
case value_t::number_integer:
case value_t::string: case value_t::string:
{ {
if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end()) if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
...@@ -1493,6 +1494,10 @@ class basic_json ...@@ -1493,6 +1494,10 @@ class basic_json
break; break;
} }
case value_t::array:
case value_t::discarded:
case value_t::null:
case value_t::object:
default: default:
{ {
break; break;
...@@ -1537,6 +1542,8 @@ class basic_json ...@@ -1537,6 +1542,8 @@ class basic_json
break; break;
} }
case value_t::discarded:
case value_t::null:
default: default:
{ {
throw std::domain_error("cannot use construct with iterators from " + first.m_object->type_name()); throw std::domain_error("cannot use construct with iterators from " + first.m_object->type_name());
...@@ -1571,47 +1578,48 @@ class basic_json ...@@ -1571,47 +1578,48 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::null): case value_t::object:
case (value_t::discarded):
{
break;
}
case (value_t::object):
{ {
m_value = *other.m_value.object; m_value = *other.m_value.object;
break; break;
} }
case (value_t::array): case value_t::array:
{ {
m_value = *other.m_value.array; m_value = *other.m_value.array;
break; break;
} }
case (value_t::string): case value_t::string:
{ {
m_value = *other.m_value.string; m_value = *other.m_value.string;
break; break;
} }
case (value_t::boolean): case value_t::boolean:
{ {
m_value = other.m_value.boolean; m_value = other.m_value.boolean;
break; break;
} }
case (value_t::number_integer): case value_t::number_integer:
{ {
m_value = other.m_value.number_integer; m_value = other.m_value.number_integer;
break; break;
} }
case (value_t::number_float): case value_t::number_float:
{ {
m_value = other.m_value.number_float; m_value = other.m_value.number_float;
break; break;
} }
case value_t::discarded:
case value_t::null:
default:
{
break;
}
} }
} }
...@@ -1687,7 +1695,7 @@ class basic_json ...@@ -1687,7 +1695,7 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::object): case value_t::object:
{ {
AllocatorType<object_t> alloc; AllocatorType<object_t> alloc;
alloc.destroy(m_value.object); alloc.destroy(m_value.object);
...@@ -1695,7 +1703,7 @@ class basic_json ...@@ -1695,7 +1703,7 @@ class basic_json
break; break;
} }
case (value_t::array): case value_t::array:
{ {
AllocatorType<array_t> alloc; AllocatorType<array_t> alloc;
alloc.destroy(m_value.array); alloc.destroy(m_value.array);
...@@ -1703,7 +1711,7 @@ class basic_json ...@@ -1703,7 +1711,7 @@ class basic_json
break; break;
} }
case (value_t::string): case value_t::string:
{ {
AllocatorType<string_t> alloc; AllocatorType<string_t> alloc;
alloc.destroy(m_value.string); alloc.destroy(m_value.string);
...@@ -1711,6 +1719,11 @@ class basic_json ...@@ -1711,6 +1719,11 @@ class basic_json
break; break;
} }
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
default: default:
{ {
// all other types need no specific destructor // all other types need no specific destructor
...@@ -2014,34 +2027,28 @@ class basic_json ...@@ -2014,34 +2027,28 @@ class basic_json
, int>::type = 0> , int>::type = 0>
T get_impl(T*) const T get_impl(T*) const
{ {
switch (m_type) if (m_type == value_t::object)
{
case (value_t::object):
{ {
return T(m_value.object->begin(), m_value.object->end()); return T(m_value.object->begin(), m_value.object->end());
} }
default: else
{ {
throw std::domain_error("type must be object, but is " + type_name()); throw std::domain_error("type must be object, but is " + type_name());
} }
} }
}
/// get an object (explicit) /// get an object (explicit)
object_t get_impl(object_t*) const object_t get_impl(object_t*) const
{ {
switch (m_type) if (m_type == value_t::object)
{
case (value_t::object):
{ {
return *(m_value.object); return *(m_value.object);
} }
default: else
{ {
throw std::domain_error("type must be object, but is " + type_name()); throw std::domain_error("type must be object, but is " + type_name());
} }
} }
}
/// get an array (explicit) /// get an array (explicit)
template <class T, typename template <class T, typename
...@@ -2054,9 +2061,7 @@ class basic_json ...@@ -2054,9 +2061,7 @@ class basic_json
, int>::type = 0> , int>::type = 0>
T get_impl(T*) const T get_impl(T*) const
{ {
switch (m_type) if (m_type == value_t::array)
{
case (value_t::array):
{ {
T to_vector; T to_vector;
std::transform(m_value.array->begin(), m_value.array->end(), std::transform(m_value.array->begin(), m_value.array->end(),
...@@ -2066,12 +2071,11 @@ class basic_json ...@@ -2066,12 +2071,11 @@ class basic_json
}); });
return to_vector; return to_vector;
} }
default: else
{ {
throw std::domain_error("type must be array, but is " + type_name()); throw std::domain_error("type must be array, but is " + type_name());
} }
} }
}
/// get an array (explicit) /// get an array (explicit)
template <class T, typename template <class T, typename
...@@ -2081,9 +2085,7 @@ class basic_json ...@@ -2081,9 +2085,7 @@ class basic_json
, int>::type = 0> , int>::type = 0>
std::vector<T> get_impl(std::vector<T>*) const std::vector<T> get_impl(std::vector<T>*) const
{ {
switch (m_type) if (m_type == value_t::array)
{
case (value_t::array):
{ {
std::vector<T> to_vector; std::vector<T> to_vector;
to_vector.reserve(m_value.array->size()); to_vector.reserve(m_value.array->size());
...@@ -2094,12 +2096,11 @@ class basic_json ...@@ -2094,12 +2096,11 @@ class basic_json
}); });
return to_vector; return to_vector;
} }
default: else
{ {
throw std::domain_error("type must be array, but is " + type_name()); throw std::domain_error("type must be array, but is " + type_name());
} }
} }
}
/// get an array (explicit) /// get an array (explicit)
template <class T, typename template <class T, typename
...@@ -2109,34 +2110,28 @@ class basic_json ...@@ -2109,34 +2110,28 @@ class basic_json
, int>::type = 0> , int>::type = 0>
T get_impl(T*) const T get_impl(T*) const
{ {
switch (m_type) if (m_type == value_t::array)
{
case (value_t::array):
{ {
return T(m_value.array->begin(), m_value.array->end()); return T(m_value.array->begin(), m_value.array->end());
} }
default: else
{ {
throw std::domain_error("type must be array, but is " + type_name()); throw std::domain_error("type must be array, but is " + type_name());
} }
} }
}
/// get an array (explicit) /// get an array (explicit)
array_t get_impl(array_t*) const array_t get_impl(array_t*) const
{ {
switch (m_type) if (m_type == value_t::array)
{
case (value_t::array):
{ {
return *(m_value.array); return *(m_value.array);
} }
default: else
{ {
throw std::domain_error("type must be array, but is " + type_name()); throw std::domain_error("type must be array, but is " + type_name());
} }
} }
}
/// get a string (explicit) /// get a string (explicit)
template <typename T, typename template <typename T, typename
...@@ -2145,18 +2140,15 @@ class basic_json ...@@ -2145,18 +2140,15 @@ class basic_json
, int>::type = 0> , int>::type = 0>
T get_impl(T*) const T get_impl(T*) const
{ {
switch (m_type) if (m_type == value_t::string)
{
case (value_t::string):
{ {
return *m_value.string; return *m_value.string;
} }
default: else
{ {
throw std::domain_error("type must be string, but is " + type_name()); throw std::domain_error("type must be string, but is " + type_name());
} }
} }
}
/// get a number (explicit) /// get a number (explicit)
template<typename T, typename template<typename T, typename
...@@ -2167,14 +2159,22 @@ class basic_json ...@@ -2167,14 +2159,22 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::number_integer): case value_t::number_integer:
{ {
return static_cast<T>(m_value.number_integer); return static_cast<T>(m_value.number_integer);
} }
case (value_t::number_float):
case value_t::number_float:
{ {
return static_cast<T>(m_value.number_float); return static_cast<T>(m_value.number_float);
} }
case value_t::array:
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::object:
case value_t::string:
default: default:
{ {
throw std::domain_error("type must be number, but is " + type_name()); throw std::domain_error("type must be number, but is " + type_name());
...@@ -2185,18 +2185,15 @@ class basic_json ...@@ -2185,18 +2185,15 @@ class basic_json
/// get a boolean (explicit) /// get a boolean (explicit)
boolean_t get_impl(boolean_t*) const boolean_t get_impl(boolean_t*) const
{ {
switch (m_type) if (m_type == value_t::boolean)
{
case (value_t::boolean):
{ {
return m_value.boolean; return m_value.boolean;
} }
default: else
{ {
throw std::domain_error("type must be boolean, but is " + type_name()); throw std::domain_error("type must be boolean, but is " + type_name());
} }
} }
}
/// get a pointer to the value (object) /// get a pointer to the value (object)
object_t* get_impl_ptr(object_t*) noexcept object_t* get_impl_ptr(object_t*) noexcept
...@@ -2845,9 +2842,9 @@ class basic_json ...@@ -2845,9 +2842,9 @@ class basic_json
switch (m_type) switch (m_type)
{ {
case value_t::number_integer:
case value_t::number_float:
case value_t::boolean: case value_t::boolean:
case value_t::number_float:
case value_t::number_integer:
case value_t::string: case value_t::string:
{ {
if (not pos.m_it.primitive_iterator.is_begin()) if (not pos.m_it.primitive_iterator.is_begin())
...@@ -2877,6 +2874,8 @@ class basic_json ...@@ -2877,6 +2874,8 @@ class basic_json
break; break;
} }
case value_t::discarded:
case value_t::null:
default: default:
{ {
throw std::domain_error("cannot use erase() with " + type_name()); throw std::domain_error("cannot use erase() with " + type_name());
...@@ -2938,9 +2937,9 @@ class basic_json ...@@ -2938,9 +2937,9 @@ class basic_json
switch (m_type) switch (m_type)
{ {
case value_t::number_integer:
case value_t::number_float:
case value_t::boolean: case value_t::boolean:
case value_t::number_float:
case value_t::number_integer:
case value_t::string: case value_t::string:
{ {
if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end()) if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
...@@ -2972,6 +2971,8 @@ class basic_json ...@@ -2972,6 +2971,8 @@ class basic_json
break; break;
} }
case value_t::discarded:
case value_t::null:
default: default:
{ {
throw std::domain_error("cannot use erase with " + type_name()); throw std::domain_error("cannot use erase with " + type_name());
...@@ -3364,21 +3365,26 @@ class basic_json ...@@ -3364,21 +3365,26 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::null): case value_t::null:
{ {
return true; return true;
} }
case (value_t::array): case value_t::array:
{ {
return m_value.array->empty(); return m_value.array->empty();
} }
case (value_t::object): case value_t::object:
{ {
return m_value.object->empty(); return m_value.object->empty();
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
// all other types are nonempty // all other types are nonempty
...@@ -3418,21 +3424,26 @@ class basic_json ...@@ -3418,21 +3424,26 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::null): case value_t::null:
{ {
return 0; return 0;
} }
case (value_t::array): case value_t::array:
{ {
return m_value.array->size(); return m_value.array->size();
} }
case (value_t::object): case value_t::object:
{ {
return m_value.object->size(); return m_value.object->size();
} }
case value_t::boolean:
case value_t::discarded:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
// all other types have size 1 // all other types have size 1
...@@ -3475,16 +3486,22 @@ class basic_json ...@@ -3475,16 +3486,22 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::array): case value_t::array:
{ {
return m_value.array->max_size(); return m_value.array->max_size();
} }
case (value_t::object): case value_t::object:
{ {
return m_value.object->max_size(); return m_value.object->max_size();
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
// all other types have max_size() == size() // all other types have max_size() == size()
...@@ -3530,47 +3547,48 @@ class basic_json ...@@ -3530,47 +3547,48 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::null): case value_t::number_integer:
case (value_t::discarded):
{
break;
}
case (value_t::number_integer):
{ {
m_value.number_integer = 0; m_value.number_integer = 0;
break; break;
} }
case (value_t::number_float): case value_t::number_float:
{ {
m_value.number_float = 0.0; m_value.number_float = 0.0;
break; break;
} }
case (value_t::boolean): case value_t::boolean:
{ {
m_value.boolean = false; m_value.boolean = false;
break; break;
} }
case (value_t::string): case value_t::string:
{ {
m_value.string->clear(); m_value.string->clear();
break; break;
} }
case (value_t::array): case value_t::array:
{ {
m_value.array->clear(); m_value.array->clear();
break; break;
} }
case (value_t::object): case value_t::object:
{ {
m_value.object->clear(); m_value.object->clear();
break; break;
} }
case value_t::discarded:
case value_t::null:
default:
{
break;
}
} }
} }
...@@ -4067,21 +4085,23 @@ class basic_json ...@@ -4067,21 +4085,23 @@ class basic_json
{ {
switch (lhs_type) switch (lhs_type)
{ {
case (value_t::array): case value_t::array:
return *lhs.m_value.array == *rhs.m_value.array; return *lhs.m_value.array == *rhs.m_value.array;
case (value_t::object): case value_t::object:
return *lhs.m_value.object == *rhs.m_value.object; return *lhs.m_value.object == *rhs.m_value.object;
case (value_t::null): case value_t::null:
return true; return true;
case (value_t::string): case value_t::string:
return *lhs.m_value.string == *rhs.m_value.string; return *lhs.m_value.string == *rhs.m_value.string;
case (value_t::boolean): case value_t::boolean:
return lhs.m_value.boolean == rhs.m_value.boolean; return lhs.m_value.boolean == rhs.m_value.boolean;
case (value_t::number_integer): case value_t::number_integer:
return lhs.m_value.number_integer == rhs.m_value.number_integer; return lhs.m_value.number_integer == rhs.m_value.number_integer;
case (value_t::number_float): case value_t::number_float:
return approx(lhs.m_value.number_float, rhs.m_value.number_float); return approx(lhs.m_value.number_float, rhs.m_value.number_float);
case (value_t::discarded): case value_t::discarded:
return false;
default:
return false; return false;
} }
} }
...@@ -4208,21 +4228,23 @@ class basic_json ...@@ -4208,21 +4228,23 @@ class basic_json
{ {
switch (lhs_type) switch (lhs_type)
{ {
case (value_t::array): case value_t::array:
return *lhs.m_value.array < *rhs.m_value.array; return *lhs.m_value.array < *rhs.m_value.array;
case (value_t::object): case value_t::object:
return *lhs.m_value.object < *rhs.m_value.object; return *lhs.m_value.object < *rhs.m_value.object;
case (value_t::null): case value_t::null:
return false; return false;
case (value_t::string): case value_t::string:
return *lhs.m_value.string < *rhs.m_value.string; return *lhs.m_value.string < *rhs.m_value.string;
case (value_t::boolean): case value_t::boolean:
return lhs.m_value.boolean < rhs.m_value.boolean; return lhs.m_value.boolean < rhs.m_value.boolean;
case (value_t::number_integer): case value_t::number_integer:
return lhs.m_value.number_integer < rhs.m_value.number_integer; return lhs.m_value.number_integer < rhs.m_value.number_integer;
case (value_t::number_float): case value_t::number_float:
return lhs.m_value.number_float < rhs.m_value.number_float; return lhs.m_value.number_float < rhs.m_value.number_float;
case (value_t::discarded): case value_t::discarded:
return false;
default:
return false; return false;
} }
} }
...@@ -4475,36 +4497,38 @@ class basic_json ...@@ -4475,36 +4497,38 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::null): case value_t::null:
{ {
return "null"; return "null";
} }
case (value_t::object): case value_t::object:
{ {
return "object"; return "object";
} }
case (value_t::array): case value_t::array:
{ {
return "array"; return "array";
} }
case (value_t::string): case value_t::string:
{ {
return "string"; return "string";
} }
case (value_t::boolean): case value_t::boolean:
{ {
return "boolean"; return "boolean";
} }
case (value_t::discarded): case value_t::discarded:
{ {
return "discarded"; return "discarded";
} }
case value_t::number_float:
case value_t::number_integer:
default: default:
{ {
return "number"; return "number";
...@@ -4699,7 +4723,7 @@ class basic_json ...@@ -4699,7 +4723,7 @@ class basic_json
switch (m_type) switch (m_type)
{ {
case (value_t::object): case value_t::object:
{ {
if (m_value.object->empty()) if (m_value.object->empty())
{ {
...@@ -4739,7 +4763,7 @@ class basic_json ...@@ -4739,7 +4763,7 @@ class basic_json
return; return;
} }
case (value_t::array): case value_t::array:
{ {
if (m_value.array->empty()) if (m_value.array->empty())
{ {
...@@ -4777,25 +4801,25 @@ class basic_json ...@@ -4777,25 +4801,25 @@ class basic_json
return; return;
} }
case (value_t::string): case value_t::string:
{ {
o << string_t("\"") << escape_string(*m_value.string) << "\""; o << string_t("\"") << escape_string(*m_value.string) << "\"";
return; return;
} }
case (value_t::boolean): case value_t::boolean:
{ {
o << (m_value.boolean ? "true" : "false"); o << (m_value.boolean ? "true" : "false");
return; return;
} }
case (value_t::number_integer): case value_t::number_integer:
{ {
o << m_value.number_integer; o << m_value.number_integer;
return; return;
} }
case (value_t::number_float): case value_t::number_float:
{ {
// 15 digits of precision allows round-trip IEEE 754 // 15 digits of precision allows round-trip IEEE 754
// string->double->string; to be safe, we read this value from // string->double->string; to be safe, we read this value from
...@@ -4804,17 +4828,22 @@ class basic_json ...@@ -4804,17 +4828,22 @@ class basic_json
return; return;
} }
case (value_t::discarded): case value_t::discarded:
{ {
o << "<discarded>"; o << "<discarded>";
return; return;
} }
default: case value_t::null:
{ {
o << "null"; o << "null";
return; return;
} }
default:
{
return;
}
} }
} }
...@@ -4950,16 +4979,24 @@ class basic_json ...@@ -4950,16 +4979,24 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
m_it.object_iterator = typename object_t::iterator(); m_it.object_iterator = typename object_t::iterator();
break; break;
} }
case (basic_json::value_t::array):
case basic_json::value_t::array:
{ {
m_it.array_iterator = typename array_t::iterator(); m_it.array_iterator = typename array_t::iterator();
break; break;
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
m_it.primitive_iterator = primitive_iterator_t(); m_it.primitive_iterator = primitive_iterator_t();
...@@ -4973,18 +5010,24 @@ class basic_json ...@@ -4973,18 +5010,24 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
m_it.object_iterator = other.m_it.object_iterator; m_it.object_iterator = other.m_it.object_iterator;
break; break;
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
m_it.array_iterator = other.m_it.array_iterator; m_it.array_iterator = other.m_it.array_iterator;
break; break;
} }
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
m_it.primitive_iterator = other.m_it.primitive_iterator; m_it.primitive_iterator = other.m_it.primitive_iterator;
...@@ -5017,25 +5060,30 @@ class basic_json ...@@ -5017,25 +5060,30 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
m_it.object_iterator = m_object->m_value.object->begin(); m_it.object_iterator = m_object->m_value.object->begin();
break; break;
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
m_it.array_iterator = m_object->m_value.array->begin(); m_it.array_iterator = m_object->m_value.array->begin();
break; break;
} }
case (basic_json::value_t::null): case basic_json::value_t::null:
{ {
// set to end so begin()==end() is true: null is empty // set to end so begin()==end() is true: null is empty
m_it.primitive_iterator.set_end(); m_it.primitive_iterator.set_end();
break; break;
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
m_it.primitive_iterator.set_begin(); m_it.primitive_iterator.set_begin();
...@@ -5049,18 +5097,24 @@ class basic_json ...@@ -5049,18 +5097,24 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
m_it.object_iterator = m_object->m_value.object->end(); m_it.object_iterator = m_object->m_value.object->end();
break; break;
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
m_it.array_iterator = m_object->m_value.array->end(); m_it.array_iterator = m_object->m_value.array->end();
break; break;
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
m_it.primitive_iterator.set_end(); m_it.primitive_iterator.set_end();
...@@ -5075,21 +5129,26 @@ class basic_json ...@@ -5075,21 +5129,26 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
return m_it.object_iterator->second; return m_it.object_iterator->second;
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
return *m_it.array_iterator; return *m_it.array_iterator;
} }
case (basic_json::value_t::null): case basic_json::value_t::null:
{ {
throw std::out_of_range("cannot get value"); throw std::out_of_range("cannot get value");
} }
case value_t::boolean:
case value_t::discarded:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
if (m_it.primitive_iterator.is_begin()) if (m_it.primitive_iterator.is_begin())
...@@ -5109,16 +5168,22 @@ class basic_json ...@@ -5109,16 +5168,22 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
return &(m_it.object_iterator->second); return &(m_it.object_iterator->second);
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
return &*m_it.array_iterator; return &*m_it.array_iterator;
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
if (m_it.primitive_iterator.is_begin()) if (m_it.primitive_iterator.is_begin())
...@@ -5147,18 +5212,24 @@ class basic_json ...@@ -5147,18 +5212,24 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
++m_it.object_iterator; ++m_it.object_iterator;
break; break;
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
++m_it.array_iterator; ++m_it.array_iterator;
break; break;
} }
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
++m_it.primitive_iterator; ++m_it.primitive_iterator;
...@@ -5183,18 +5254,24 @@ class basic_json ...@@ -5183,18 +5254,24 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
--m_it.object_iterator; --m_it.object_iterator;
break; break;
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
--m_it.array_iterator; --m_it.array_iterator;
break; break;
} }
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
--m_it.primitive_iterator; --m_it.primitive_iterator;
...@@ -5216,16 +5293,22 @@ class basic_json ...@@ -5216,16 +5293,22 @@ class basic_json
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
return (m_it.object_iterator == other.m_it.object_iterator); return (m_it.object_iterator == other.m_it.object_iterator);
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
return (m_it.array_iterator == other.m_it.array_iterator); return (m_it.array_iterator == other.m_it.array_iterator);
} }
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
return (m_it.primitive_iterator == other.m_it.primitive_iterator); return (m_it.primitive_iterator == other.m_it.primitive_iterator);
...@@ -5250,16 +5333,22 @@ class basic_json ...@@ -5250,16 +5333,22 @@ class basic_json
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
throw std::domain_error("cannot use operator< for object iterators"); throw std::domain_error("cannot use operator< for object iterators");
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
return (m_it.array_iterator < other.m_it.array_iterator); return (m_it.array_iterator < other.m_it.array_iterator);
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
return (m_it.primitive_iterator < other.m_it.primitive_iterator); return (m_it.primitive_iterator < other.m_it.primitive_iterator);
...@@ -5290,17 +5379,23 @@ class basic_json ...@@ -5290,17 +5379,23 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
throw std::domain_error("cannot use operator+= for object iterators"); throw std::domain_error("cannot use operator+= for object iterators");
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
m_it.array_iterator += i; m_it.array_iterator += i;
break; break;
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
m_it.primitive_iterator += i; m_it.primitive_iterator += i;
...@@ -5338,16 +5433,22 @@ class basic_json ...@@ -5338,16 +5433,22 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
throw std::domain_error("cannot use operator- for object iterators"); throw std::domain_error("cannot use operator- for object iterators");
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
return m_it.array_iterator - other.m_it.array_iterator; return m_it.array_iterator - other.m_it.array_iterator;
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
return m_it.primitive_iterator - other.m_it.primitive_iterator; return m_it.primitive_iterator - other.m_it.primitive_iterator;
...@@ -5360,21 +5461,26 @@ class basic_json ...@@ -5360,21 +5461,26 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
throw std::domain_error("cannot use operator[] for object iterators"); throw std::domain_error("cannot use operator[] for object iterators");
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
return *(m_it.array_iterator + n); return *(m_it.array_iterator + n);
} }
case (basic_json::value_t::null): case basic_json::value_t::null:
{ {
throw std::out_of_range("cannot get value"); throw std::out_of_range("cannot get value");
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
if (m_it.primitive_iterator == -n) if (m_it.primitive_iterator == -n)
...@@ -5392,19 +5498,15 @@ class basic_json ...@@ -5392,19 +5498,15 @@ class basic_json
/// return the key of an object iterator /// return the key of an object iterator
typename object_t::key_type key() const typename object_t::key_type key() const
{ {
switch (m_object->m_type) if (m_object->m_type == basic_json::value_t::object)
{
case (basic_json::value_t::object):
{ {
return m_it.object_iterator->first; return m_it.object_iterator->first;
} }
else
default:
{ {
throw std::domain_error("cannot use key() for non-object iterators"); throw std::domain_error("cannot use key() for non-object iterators");
} }
} }
}
/// return the value of an iterator /// return the value of an iterator
reference value() const reference value() const
...@@ -5713,18 +5815,24 @@ class basic_json ...@@ -5713,18 +5815,24 @@ class basic_json
switch (anchor.m_object->type()) switch (anchor.m_object->type())
{ {
/// use integer array index as key /// use integer array index as key
case (value_t::array): case value_t::array:
{ {
return std::to_string(array_index); return std::to_string(array_index);
} }
/// use key from the object /// use key from the object
case (value_t::object): case value_t::object:
{ {
return anchor.key(); return anchor.key();
} }
/// use an empty key for all primitive types /// use an empty key for all primitive types
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
return ""; return "";
...@@ -5899,34 +6007,36 @@ class basic_json ...@@ -5899,34 +6007,36 @@ class basic_json
{ {
switch (t) switch (t)
{ {
case (token_type::uninitialized): case token_type::uninitialized:
return "<uninitialized>"; return "<uninitialized>";
case (token_type::literal_true): case token_type::literal_true:
return "true literal"; return "true literal";
case (token_type::literal_false): case token_type::literal_false:
return "false literal"; return "false literal";
case (token_type::literal_null): case token_type::literal_null:
return "null literal"; return "null literal";
case (token_type::value_string): case token_type::value_string:
return "string literal"; return "string literal";
case (token_type::value_number): case token_type::value_number:
return "number literal"; return "number literal";
case (token_type::begin_array): case token_type::begin_array:
return "["; return "[";
case (token_type::begin_object): case token_type::begin_object:
return "{"; return "{";
case (token_type::end_array): case token_type::end_array:
return "]"; return "]";
case (token_type::end_object): case token_type::end_object:
return "}"; return "}";
case (token_type::name_separator): case token_type::name_separator:
return ":"; return ":";
case (token_type::value_separator): case token_type::value_separator:
return ","; return ",";
case (token_type::end_of_input): case token_type::end_of_input:
return "<end of input>"; return "<end of input>";
default: case token_type::parse_error:
return "<parse error>"; return "<parse error>";
default:
return "";
} }
} }
...@@ -6877,6 +6987,11 @@ basic_json_parser_64: ...@@ -6877,6 +6987,11 @@ basic_json_parser_64:
} }
break; break;
} }
default:
{
break;
}
} }
} }
else else
...@@ -6978,7 +7093,7 @@ basic_json_parser_64: ...@@ -6978,7 +7093,7 @@ basic_json_parser_64:
switch (last_token) switch (last_token)
{ {
case (lexer::token_type::begin_object): case lexer::token_type::begin_object:
{ {
if (keep and (not callback or (keep = callback(depth++, parse_event_t::object_start, result)))) if (keep and (not callback or (keep = callback(depth++, parse_event_t::object_start, result))))
{ {
...@@ -7056,7 +7171,7 @@ basic_json_parser_64: ...@@ -7056,7 +7171,7 @@ basic_json_parser_64:
return result; return result;
} }
case (lexer::token_type::begin_array): case lexer::token_type::begin_array:
{ {
if (keep and (not callback or (keep = callback(depth++, parse_event_t::array_start, result)))) if (keep and (not callback or (keep = callback(depth++, parse_event_t::array_start, result))))
{ {
...@@ -7111,14 +7226,14 @@ basic_json_parser_64: ...@@ -7111,14 +7226,14 @@ basic_json_parser_64:
return result; return result;
} }
case (lexer::token_type::literal_null): case lexer::token_type::literal_null:
{ {
get_token(); get_token();
result.m_type = value_t::null; result.m_type = value_t::null;
break; break;
} }
case (lexer::token_type::value_string): case lexer::token_type::value_string:
{ {
const auto s = m_lexer.get_string(); const auto s = m_lexer.get_string();
get_token(); get_token();
...@@ -7126,7 +7241,7 @@ basic_json_parser_64: ...@@ -7126,7 +7241,7 @@ basic_json_parser_64:
break; break;
} }
case (lexer::token_type::literal_true): case lexer::token_type::literal_true:
{ {
get_token(); get_token();
result.m_type = value_t::boolean; result.m_type = value_t::boolean;
...@@ -7134,7 +7249,7 @@ basic_json_parser_64: ...@@ -7134,7 +7249,7 @@ basic_json_parser_64:
break; break;
} }
case (lexer::token_type::literal_false): case lexer::token_type::literal_false:
{ {
get_token(); get_token();
result.m_type = value_t::boolean; result.m_type = value_t::boolean;
...@@ -7142,7 +7257,7 @@ basic_json_parser_64: ...@@ -7142,7 +7257,7 @@ basic_json_parser_64:
break; break;
} }
case (lexer::token_type::value_number): case lexer::token_type::value_number:
{ {
auto float_val = m_lexer.get_number(); auto float_val = m_lexer.get_number();
...@@ -7173,6 +7288,13 @@ basic_json_parser_64: ...@@ -7173,6 +7288,13 @@ basic_json_parser_64:
break; break;
} }
case lexer::token_type::end_array:
case lexer::token_type::end_object:
case lexer::token_type::end_of_input:
case lexer::token_type::name_separator:
case lexer::token_type::parse_error:
case lexer::token_type::uninitialized:
case lexer::token_type::value_separator:
default: default:
{ {
// the last token was unexpected // the last token was unexpected
......
...@@ -650,47 +650,48 @@ class basic_json ...@@ -650,47 +650,48 @@ class basic_json
{ {
switch (t) switch (t)
{ {
case (value_t::null): case value_t::object:
case (value_t::discarded):
{
break;
}
case (value_t::object):
{ {
object = create<object_t>(); object = create<object_t>();
break; break;
} }
case (value_t::array): case value_t::array:
{ {
array = create<array_t>(); array = create<array_t>();
break; break;
} }
case (value_t::string): case value_t::string:
{ {
string = create<string_t>(""); string = create<string_t>("");
break; break;
} }
case (value_t::boolean): case value_t::boolean:
{ {
boolean = boolean_t(false); boolean = boolean_t(false);
break; break;
} }
case (value_t::number_integer): case value_t::number_integer:
{ {
number_integer = number_integer_t(0); number_integer = number_integer_t(0);
break; break;
} }
case (value_t::number_float): case value_t::number_float:
{ {
number_float = number_float_t(0.0); number_float = number_float_t(0.0);
break; break;
} }
case value_t::null:
case value_t::discarded:
default:
{
break;
}
} }
} }
...@@ -1481,9 +1482,9 @@ class basic_json ...@@ -1481,9 +1482,9 @@ class basic_json
// check if iterator range is complete for primitive values // check if iterator range is complete for primitive values
switch (m_type) switch (m_type)
{ {
case value_t::number_integer:
case value_t::number_float:
case value_t::boolean: case value_t::boolean:
case value_t::number_float:
case value_t::number_integer:
case value_t::string: case value_t::string:
{ {
if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end()) if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
...@@ -1493,6 +1494,10 @@ class basic_json ...@@ -1493,6 +1494,10 @@ class basic_json
break; break;
} }
case value_t::array:
case value_t::discarded:
case value_t::null:
case value_t::object:
default: default:
{ {
break; break;
...@@ -1537,6 +1542,8 @@ class basic_json ...@@ -1537,6 +1542,8 @@ class basic_json
break; break;
} }
case value_t::discarded:
case value_t::null:
default: default:
{ {
throw std::domain_error("cannot use construct with iterators from " + first.m_object->type_name()); throw std::domain_error("cannot use construct with iterators from " + first.m_object->type_name());
...@@ -1571,47 +1578,48 @@ class basic_json ...@@ -1571,47 +1578,48 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::null): case value_t::object:
case (value_t::discarded):
{
break;
}
case (value_t::object):
{ {
m_value = *other.m_value.object; m_value = *other.m_value.object;
break; break;
} }
case (value_t::array): case value_t::array:
{ {
m_value = *other.m_value.array; m_value = *other.m_value.array;
break; break;
} }
case (value_t::string): case value_t::string:
{ {
m_value = *other.m_value.string; m_value = *other.m_value.string;
break; break;
} }
case (value_t::boolean): case value_t::boolean:
{ {
m_value = other.m_value.boolean; m_value = other.m_value.boolean;
break; break;
} }
case (value_t::number_integer): case value_t::number_integer:
{ {
m_value = other.m_value.number_integer; m_value = other.m_value.number_integer;
break; break;
} }
case (value_t::number_float): case value_t::number_float:
{ {
m_value = other.m_value.number_float; m_value = other.m_value.number_float;
break; break;
} }
case value_t::discarded:
case value_t::null:
default:
{
break;
}
} }
} }
...@@ -1687,7 +1695,7 @@ class basic_json ...@@ -1687,7 +1695,7 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::object): case value_t::object:
{ {
AllocatorType<object_t> alloc; AllocatorType<object_t> alloc;
alloc.destroy(m_value.object); alloc.destroy(m_value.object);
...@@ -1695,7 +1703,7 @@ class basic_json ...@@ -1695,7 +1703,7 @@ class basic_json
break; break;
} }
case (value_t::array): case value_t::array:
{ {
AllocatorType<array_t> alloc; AllocatorType<array_t> alloc;
alloc.destroy(m_value.array); alloc.destroy(m_value.array);
...@@ -1703,7 +1711,7 @@ class basic_json ...@@ -1703,7 +1711,7 @@ class basic_json
break; break;
} }
case (value_t::string): case value_t::string:
{ {
AllocatorType<string_t> alloc; AllocatorType<string_t> alloc;
alloc.destroy(m_value.string); alloc.destroy(m_value.string);
...@@ -1711,6 +1719,11 @@ class basic_json ...@@ -1711,6 +1719,11 @@ class basic_json
break; break;
} }
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
default: default:
{ {
// all other types need no specific destructor // all other types need no specific destructor
...@@ -2014,34 +2027,28 @@ class basic_json ...@@ -2014,34 +2027,28 @@ class basic_json
, int>::type = 0> , int>::type = 0>
T get_impl(T*) const T get_impl(T*) const
{ {
switch (m_type) if (m_type == value_t::object)
{
case (value_t::object):
{ {
return T(m_value.object->begin(), m_value.object->end()); return T(m_value.object->begin(), m_value.object->end());
} }
default: else
{ {
throw std::domain_error("type must be object, but is " + type_name()); throw std::domain_error("type must be object, but is " + type_name());
} }
} }
}
/// get an object (explicit) /// get an object (explicit)
object_t get_impl(object_t*) const object_t get_impl(object_t*) const
{ {
switch (m_type) if (m_type == value_t::object)
{
case (value_t::object):
{ {
return *(m_value.object); return *(m_value.object);
} }
default: else
{ {
throw std::domain_error("type must be object, but is " + type_name()); throw std::domain_error("type must be object, but is " + type_name());
} }
} }
}
/// get an array (explicit) /// get an array (explicit)
template <class T, typename template <class T, typename
...@@ -2054,9 +2061,7 @@ class basic_json ...@@ -2054,9 +2061,7 @@ class basic_json
, int>::type = 0> , int>::type = 0>
T get_impl(T*) const T get_impl(T*) const
{ {
switch (m_type) if (m_type == value_t::array)
{
case (value_t::array):
{ {
T to_vector; T to_vector;
std::transform(m_value.array->begin(), m_value.array->end(), std::transform(m_value.array->begin(), m_value.array->end(),
...@@ -2066,12 +2071,11 @@ class basic_json ...@@ -2066,12 +2071,11 @@ class basic_json
}); });
return to_vector; return to_vector;
} }
default: else
{ {
throw std::domain_error("type must be array, but is " + type_name()); throw std::domain_error("type must be array, but is " + type_name());
} }
} }
}
/// get an array (explicit) /// get an array (explicit)
template <class T, typename template <class T, typename
...@@ -2081,9 +2085,7 @@ class basic_json ...@@ -2081,9 +2085,7 @@ class basic_json
, int>::type = 0> , int>::type = 0>
std::vector<T> get_impl(std::vector<T>*) const std::vector<T> get_impl(std::vector<T>*) const
{ {
switch (m_type) if (m_type == value_t::array)
{
case (value_t::array):
{ {
std::vector<T> to_vector; std::vector<T> to_vector;
to_vector.reserve(m_value.array->size()); to_vector.reserve(m_value.array->size());
...@@ -2094,12 +2096,11 @@ class basic_json ...@@ -2094,12 +2096,11 @@ class basic_json
}); });
return to_vector; return to_vector;
} }
default: else
{ {
throw std::domain_error("type must be array, but is " + type_name()); throw std::domain_error("type must be array, but is " + type_name());
} }
} }
}
/// get an array (explicit) /// get an array (explicit)
template <class T, typename template <class T, typename
...@@ -2109,34 +2110,28 @@ class basic_json ...@@ -2109,34 +2110,28 @@ class basic_json
, int>::type = 0> , int>::type = 0>
T get_impl(T*) const T get_impl(T*) const
{ {
switch (m_type) if (m_type == value_t::array)
{
case (value_t::array):
{ {
return T(m_value.array->begin(), m_value.array->end()); return T(m_value.array->begin(), m_value.array->end());
} }
default: else
{ {
throw std::domain_error("type must be array, but is " + type_name()); throw std::domain_error("type must be array, but is " + type_name());
} }
} }
}
/// get an array (explicit) /// get an array (explicit)
array_t get_impl(array_t*) const array_t get_impl(array_t*) const
{ {
switch (m_type) if (m_type == value_t::array)
{
case (value_t::array):
{ {
return *(m_value.array); return *(m_value.array);
} }
default: else
{ {
throw std::domain_error("type must be array, but is " + type_name()); throw std::domain_error("type must be array, but is " + type_name());
} }
} }
}
/// get a string (explicit) /// get a string (explicit)
template <typename T, typename template <typename T, typename
...@@ -2145,18 +2140,15 @@ class basic_json ...@@ -2145,18 +2140,15 @@ class basic_json
, int>::type = 0> , int>::type = 0>
T get_impl(T*) const T get_impl(T*) const
{ {
switch (m_type) if (m_type == value_t::string)
{
case (value_t::string):
{ {
return *m_value.string; return *m_value.string;
} }
default: else
{ {
throw std::domain_error("type must be string, but is " + type_name()); throw std::domain_error("type must be string, but is " + type_name());
} }
} }
}
/// get a number (explicit) /// get a number (explicit)
template<typename T, typename template<typename T, typename
...@@ -2167,14 +2159,22 @@ class basic_json ...@@ -2167,14 +2159,22 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::number_integer): case value_t::number_integer:
{ {
return static_cast<T>(m_value.number_integer); return static_cast<T>(m_value.number_integer);
} }
case (value_t::number_float):
case value_t::number_float:
{ {
return static_cast<T>(m_value.number_float); return static_cast<T>(m_value.number_float);
} }
case value_t::array:
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::object:
case value_t::string:
default: default:
{ {
throw std::domain_error("type must be number, but is " + type_name()); throw std::domain_error("type must be number, but is " + type_name());
...@@ -2185,18 +2185,15 @@ class basic_json ...@@ -2185,18 +2185,15 @@ class basic_json
/// get a boolean (explicit) /// get a boolean (explicit)
boolean_t get_impl(boolean_t*) const boolean_t get_impl(boolean_t*) const
{ {
switch (m_type) if (m_type == value_t::boolean)
{
case (value_t::boolean):
{ {
return m_value.boolean; return m_value.boolean;
} }
default: else
{ {
throw std::domain_error("type must be boolean, but is " + type_name()); throw std::domain_error("type must be boolean, but is " + type_name());
} }
} }
}
/// get a pointer to the value (object) /// get a pointer to the value (object)
object_t* get_impl_ptr(object_t*) noexcept object_t* get_impl_ptr(object_t*) noexcept
...@@ -2845,9 +2842,9 @@ class basic_json ...@@ -2845,9 +2842,9 @@ class basic_json
switch (m_type) switch (m_type)
{ {
case value_t::number_integer:
case value_t::number_float:
case value_t::boolean: case value_t::boolean:
case value_t::number_float:
case value_t::number_integer:
case value_t::string: case value_t::string:
{ {
if (not pos.m_it.primitive_iterator.is_begin()) if (not pos.m_it.primitive_iterator.is_begin())
...@@ -2877,6 +2874,8 @@ class basic_json ...@@ -2877,6 +2874,8 @@ class basic_json
break; break;
} }
case value_t::discarded:
case value_t::null:
default: default:
{ {
throw std::domain_error("cannot use erase() with " + type_name()); throw std::domain_error("cannot use erase() with " + type_name());
...@@ -2938,9 +2937,9 @@ class basic_json ...@@ -2938,9 +2937,9 @@ class basic_json
switch (m_type) switch (m_type)
{ {
case value_t::number_integer:
case value_t::number_float:
case value_t::boolean: case value_t::boolean:
case value_t::number_float:
case value_t::number_integer:
case value_t::string: case value_t::string:
{ {
if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end()) if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())
...@@ -2972,6 +2971,8 @@ class basic_json ...@@ -2972,6 +2971,8 @@ class basic_json
break; break;
} }
case value_t::discarded:
case value_t::null:
default: default:
{ {
throw std::domain_error("cannot use erase with " + type_name()); throw std::domain_error("cannot use erase with " + type_name());
...@@ -3364,21 +3365,26 @@ class basic_json ...@@ -3364,21 +3365,26 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::null): case value_t::null:
{ {
return true; return true;
} }
case (value_t::array): case value_t::array:
{ {
return m_value.array->empty(); return m_value.array->empty();
} }
case (value_t::object): case value_t::object:
{ {
return m_value.object->empty(); return m_value.object->empty();
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
// all other types are nonempty // all other types are nonempty
...@@ -3418,21 +3424,26 @@ class basic_json ...@@ -3418,21 +3424,26 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::null): case value_t::null:
{ {
return 0; return 0;
} }
case (value_t::array): case value_t::array:
{ {
return m_value.array->size(); return m_value.array->size();
} }
case (value_t::object): case value_t::object:
{ {
return m_value.object->size(); return m_value.object->size();
} }
case value_t::boolean:
case value_t::discarded:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
// all other types have size 1 // all other types have size 1
...@@ -3475,16 +3486,22 @@ class basic_json ...@@ -3475,16 +3486,22 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::array): case value_t::array:
{ {
return m_value.array->max_size(); return m_value.array->max_size();
} }
case (value_t::object): case value_t::object:
{ {
return m_value.object->max_size(); return m_value.object->max_size();
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
// all other types have max_size() == size() // all other types have max_size() == size()
...@@ -3530,47 +3547,48 @@ class basic_json ...@@ -3530,47 +3547,48 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::null): case value_t::number_integer:
case (value_t::discarded):
{
break;
}
case (value_t::number_integer):
{ {
m_value.number_integer = 0; m_value.number_integer = 0;
break; break;
} }
case (value_t::number_float): case value_t::number_float:
{ {
m_value.number_float = 0.0; m_value.number_float = 0.0;
break; break;
} }
case (value_t::boolean): case value_t::boolean:
{ {
m_value.boolean = false; m_value.boolean = false;
break; break;
} }
case (value_t::string): case value_t::string:
{ {
m_value.string->clear(); m_value.string->clear();
break; break;
} }
case (value_t::array): case value_t::array:
{ {
m_value.array->clear(); m_value.array->clear();
break; break;
} }
case (value_t::object): case value_t::object:
{ {
m_value.object->clear(); m_value.object->clear();
break; break;
} }
case value_t::discarded:
case value_t::null:
default:
{
break;
}
} }
} }
...@@ -4067,21 +4085,23 @@ class basic_json ...@@ -4067,21 +4085,23 @@ class basic_json
{ {
switch (lhs_type) switch (lhs_type)
{ {
case (value_t::array): case value_t::array:
return *lhs.m_value.array == *rhs.m_value.array; return *lhs.m_value.array == *rhs.m_value.array;
case (value_t::object): case value_t::object:
return *lhs.m_value.object == *rhs.m_value.object; return *lhs.m_value.object == *rhs.m_value.object;
case (value_t::null): case value_t::null:
return true; return true;
case (value_t::string): case value_t::string:
return *lhs.m_value.string == *rhs.m_value.string; return *lhs.m_value.string == *rhs.m_value.string;
case (value_t::boolean): case value_t::boolean:
return lhs.m_value.boolean == rhs.m_value.boolean; return lhs.m_value.boolean == rhs.m_value.boolean;
case (value_t::number_integer): case value_t::number_integer:
return lhs.m_value.number_integer == rhs.m_value.number_integer; return lhs.m_value.number_integer == rhs.m_value.number_integer;
case (value_t::number_float): case value_t::number_float:
return approx(lhs.m_value.number_float, rhs.m_value.number_float); return approx(lhs.m_value.number_float, rhs.m_value.number_float);
case (value_t::discarded): case value_t::discarded:
return false;
default:
return false; return false;
} }
} }
...@@ -4208,21 +4228,23 @@ class basic_json ...@@ -4208,21 +4228,23 @@ class basic_json
{ {
switch (lhs_type) switch (lhs_type)
{ {
case (value_t::array): case value_t::array:
return *lhs.m_value.array < *rhs.m_value.array; return *lhs.m_value.array < *rhs.m_value.array;
case (value_t::object): case value_t::object:
return *lhs.m_value.object < *rhs.m_value.object; return *lhs.m_value.object < *rhs.m_value.object;
case (value_t::null): case value_t::null:
return false; return false;
case (value_t::string): case value_t::string:
return *lhs.m_value.string < *rhs.m_value.string; return *lhs.m_value.string < *rhs.m_value.string;
case (value_t::boolean): case value_t::boolean:
return lhs.m_value.boolean < rhs.m_value.boolean; return lhs.m_value.boolean < rhs.m_value.boolean;
case (value_t::number_integer): case value_t::number_integer:
return lhs.m_value.number_integer < rhs.m_value.number_integer; return lhs.m_value.number_integer < rhs.m_value.number_integer;
case (value_t::number_float): case value_t::number_float:
return lhs.m_value.number_float < rhs.m_value.number_float; return lhs.m_value.number_float < rhs.m_value.number_float;
case (value_t::discarded): case value_t::discarded:
return false;
default:
return false; return false;
} }
} }
...@@ -4475,36 +4497,38 @@ class basic_json ...@@ -4475,36 +4497,38 @@ class basic_json
{ {
switch (m_type) switch (m_type)
{ {
case (value_t::null): case value_t::null:
{ {
return "null"; return "null";
} }
case (value_t::object): case value_t::object:
{ {
return "object"; return "object";
} }
case (value_t::array): case value_t::array:
{ {
return "array"; return "array";
} }
case (value_t::string): case value_t::string:
{ {
return "string"; return "string";
} }
case (value_t::boolean): case value_t::boolean:
{ {
return "boolean"; return "boolean";
} }
case (value_t::discarded): case value_t::discarded:
{ {
return "discarded"; return "discarded";
} }
case value_t::number_float:
case value_t::number_integer:
default: default:
{ {
return "number"; return "number";
...@@ -4699,7 +4723,7 @@ class basic_json ...@@ -4699,7 +4723,7 @@ class basic_json
switch (m_type) switch (m_type)
{ {
case (value_t::object): case value_t::object:
{ {
if (m_value.object->empty()) if (m_value.object->empty())
{ {
...@@ -4739,7 +4763,7 @@ class basic_json ...@@ -4739,7 +4763,7 @@ class basic_json
return; return;
} }
case (value_t::array): case value_t::array:
{ {
if (m_value.array->empty()) if (m_value.array->empty())
{ {
...@@ -4777,25 +4801,25 @@ class basic_json ...@@ -4777,25 +4801,25 @@ class basic_json
return; return;
} }
case (value_t::string): case value_t::string:
{ {
o << string_t("\"") << escape_string(*m_value.string) << "\""; o << string_t("\"") << escape_string(*m_value.string) << "\"";
return; return;
} }
case (value_t::boolean): case value_t::boolean:
{ {
o << (m_value.boolean ? "true" : "false"); o << (m_value.boolean ? "true" : "false");
return; return;
} }
case (value_t::number_integer): case value_t::number_integer:
{ {
o << m_value.number_integer; o << m_value.number_integer;
return; return;
} }
case (value_t::number_float): case value_t::number_float:
{ {
// 15 digits of precision allows round-trip IEEE 754 // 15 digits of precision allows round-trip IEEE 754
// string->double->string; to be safe, we read this value from // string->double->string; to be safe, we read this value from
...@@ -4804,17 +4828,22 @@ class basic_json ...@@ -4804,17 +4828,22 @@ class basic_json
return; return;
} }
case (value_t::discarded): case value_t::discarded:
{ {
o << "<discarded>"; o << "<discarded>";
return; return;
} }
default: case value_t::null:
{ {
o << "null"; o << "null";
return; return;
} }
default:
{
return;
}
} }
} }
...@@ -4950,16 +4979,24 @@ class basic_json ...@@ -4950,16 +4979,24 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
m_it.object_iterator = typename object_t::iterator(); m_it.object_iterator = typename object_t::iterator();
break; break;
} }
case (basic_json::value_t::array):
case basic_json::value_t::array:
{ {
m_it.array_iterator = typename array_t::iterator(); m_it.array_iterator = typename array_t::iterator();
break; break;
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
m_it.primitive_iterator = primitive_iterator_t(); m_it.primitive_iterator = primitive_iterator_t();
...@@ -4973,18 +5010,24 @@ class basic_json ...@@ -4973,18 +5010,24 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
m_it.object_iterator = other.m_it.object_iterator; m_it.object_iterator = other.m_it.object_iterator;
break; break;
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
m_it.array_iterator = other.m_it.array_iterator; m_it.array_iterator = other.m_it.array_iterator;
break; break;
} }
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
m_it.primitive_iterator = other.m_it.primitive_iterator; m_it.primitive_iterator = other.m_it.primitive_iterator;
...@@ -5017,25 +5060,30 @@ class basic_json ...@@ -5017,25 +5060,30 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
m_it.object_iterator = m_object->m_value.object->begin(); m_it.object_iterator = m_object->m_value.object->begin();
break; break;
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
m_it.array_iterator = m_object->m_value.array->begin(); m_it.array_iterator = m_object->m_value.array->begin();
break; break;
} }
case (basic_json::value_t::null): case basic_json::value_t::null:
{ {
// set to end so begin()==end() is true: null is empty // set to end so begin()==end() is true: null is empty
m_it.primitive_iterator.set_end(); m_it.primitive_iterator.set_end();
break; break;
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
m_it.primitive_iterator.set_begin(); m_it.primitive_iterator.set_begin();
...@@ -5049,18 +5097,24 @@ class basic_json ...@@ -5049,18 +5097,24 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
m_it.object_iterator = m_object->m_value.object->end(); m_it.object_iterator = m_object->m_value.object->end();
break; break;
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
m_it.array_iterator = m_object->m_value.array->end(); m_it.array_iterator = m_object->m_value.array->end();
break; break;
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
m_it.primitive_iterator.set_end(); m_it.primitive_iterator.set_end();
...@@ -5075,21 +5129,26 @@ class basic_json ...@@ -5075,21 +5129,26 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
return m_it.object_iterator->second; return m_it.object_iterator->second;
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
return *m_it.array_iterator; return *m_it.array_iterator;
} }
case (basic_json::value_t::null): case basic_json::value_t::null:
{ {
throw std::out_of_range("cannot get value"); throw std::out_of_range("cannot get value");
} }
case value_t::boolean:
case value_t::discarded:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
if (m_it.primitive_iterator.is_begin()) if (m_it.primitive_iterator.is_begin())
...@@ -5109,16 +5168,22 @@ class basic_json ...@@ -5109,16 +5168,22 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
return &(m_it.object_iterator->second); return &(m_it.object_iterator->second);
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
return &*m_it.array_iterator; return &*m_it.array_iterator;
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
if (m_it.primitive_iterator.is_begin()) if (m_it.primitive_iterator.is_begin())
...@@ -5147,18 +5212,24 @@ class basic_json ...@@ -5147,18 +5212,24 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
++m_it.object_iterator; ++m_it.object_iterator;
break; break;
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
++m_it.array_iterator; ++m_it.array_iterator;
break; break;
} }
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
++m_it.primitive_iterator; ++m_it.primitive_iterator;
...@@ -5183,18 +5254,24 @@ class basic_json ...@@ -5183,18 +5254,24 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
--m_it.object_iterator; --m_it.object_iterator;
break; break;
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
--m_it.array_iterator; --m_it.array_iterator;
break; break;
} }
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
--m_it.primitive_iterator; --m_it.primitive_iterator;
...@@ -5216,16 +5293,22 @@ class basic_json ...@@ -5216,16 +5293,22 @@ class basic_json
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
return (m_it.object_iterator == other.m_it.object_iterator); return (m_it.object_iterator == other.m_it.object_iterator);
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
return (m_it.array_iterator == other.m_it.array_iterator); return (m_it.array_iterator == other.m_it.array_iterator);
} }
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
return (m_it.primitive_iterator == other.m_it.primitive_iterator); return (m_it.primitive_iterator == other.m_it.primitive_iterator);
...@@ -5250,16 +5333,22 @@ class basic_json ...@@ -5250,16 +5333,22 @@ class basic_json
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
throw std::domain_error("cannot use operator< for object iterators"); throw std::domain_error("cannot use operator< for object iterators");
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
return (m_it.array_iterator < other.m_it.array_iterator); return (m_it.array_iterator < other.m_it.array_iterator);
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
return (m_it.primitive_iterator < other.m_it.primitive_iterator); return (m_it.primitive_iterator < other.m_it.primitive_iterator);
...@@ -5290,17 +5379,23 @@ class basic_json ...@@ -5290,17 +5379,23 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
throw std::domain_error("cannot use operator+= for object iterators"); throw std::domain_error("cannot use operator+= for object iterators");
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
m_it.array_iterator += i; m_it.array_iterator += i;
break; break;
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
m_it.primitive_iterator += i; m_it.primitive_iterator += i;
...@@ -5338,16 +5433,22 @@ class basic_json ...@@ -5338,16 +5433,22 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
throw std::domain_error("cannot use operator- for object iterators"); throw std::domain_error("cannot use operator- for object iterators");
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
return m_it.array_iterator - other.m_it.array_iterator; return m_it.array_iterator - other.m_it.array_iterator;
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::null:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
return m_it.primitive_iterator - other.m_it.primitive_iterator; return m_it.primitive_iterator - other.m_it.primitive_iterator;
...@@ -5360,21 +5461,26 @@ class basic_json ...@@ -5360,21 +5461,26 @@ class basic_json
{ {
switch (m_object->m_type) switch (m_object->m_type)
{ {
case (basic_json::value_t::object): case basic_json::value_t::object:
{ {
throw std::domain_error("cannot use operator[] for object iterators"); throw std::domain_error("cannot use operator[] for object iterators");
} }
case (basic_json::value_t::array): case basic_json::value_t::array:
{ {
return *(m_it.array_iterator + n); return *(m_it.array_iterator + n);
} }
case (basic_json::value_t::null): case basic_json::value_t::null:
{ {
throw std::out_of_range("cannot get value"); throw std::out_of_range("cannot get value");
} }
case basic_json::value_t::boolean:
case basic_json::value_t::discarded:
case basic_json::value_t::number_float:
case basic_json::value_t::number_integer:
case basic_json::value_t::string:
default: default:
{ {
if (m_it.primitive_iterator == -n) if (m_it.primitive_iterator == -n)
...@@ -5392,19 +5498,15 @@ class basic_json ...@@ -5392,19 +5498,15 @@ class basic_json
/// return the key of an object iterator /// return the key of an object iterator
typename object_t::key_type key() const typename object_t::key_type key() const
{ {
switch (m_object->m_type) if (m_object->m_type == basic_json::value_t::object)
{
case (basic_json::value_t::object):
{ {
return m_it.object_iterator->first; return m_it.object_iterator->first;
} }
else
default:
{ {
throw std::domain_error("cannot use key() for non-object iterators"); throw std::domain_error("cannot use key() for non-object iterators");
} }
} }
}
/// return the value of an iterator /// return the value of an iterator
reference value() const reference value() const
...@@ -5713,18 +5815,24 @@ class basic_json ...@@ -5713,18 +5815,24 @@ class basic_json
switch (anchor.m_object->type()) switch (anchor.m_object->type())
{ {
/// use integer array index as key /// use integer array index as key
case (value_t::array): case value_t::array:
{ {
return std::to_string(array_index); return std::to_string(array_index);
} }
/// use key from the object /// use key from the object
case (value_t::object): case value_t::object:
{ {
return anchor.key(); return anchor.key();
} }
/// use an empty key for all primitive types /// use an empty key for all primitive types
case value_t::boolean:
case value_t::discarded:
case value_t::null:
case value_t::number_float:
case value_t::number_integer:
case value_t::string:
default: default:
{ {
return ""; return "";
...@@ -5899,34 +6007,36 @@ class basic_json ...@@ -5899,34 +6007,36 @@ class basic_json
{ {
switch (t) switch (t)
{ {
case (token_type::uninitialized): case token_type::uninitialized:
return "<uninitialized>"; return "<uninitialized>";
case (token_type::literal_true): case token_type::literal_true:
return "true literal"; return "true literal";
case (token_type::literal_false): case token_type::literal_false:
return "false literal"; return "false literal";
case (token_type::literal_null): case token_type::literal_null:
return "null literal"; return "null literal";
case (token_type::value_string): case token_type::value_string:
return "string literal"; return "string literal";
case (token_type::value_number): case token_type::value_number:
return "number literal"; return "number literal";
case (token_type::begin_array): case token_type::begin_array:
return "["; return "[";
case (token_type::begin_object): case token_type::begin_object:
return "{"; return "{";
case (token_type::end_array): case token_type::end_array:
return "]"; return "]";
case (token_type::end_object): case token_type::end_object:
return "}"; return "}";
case (token_type::name_separator): case token_type::name_separator:
return ":"; return ":";
case (token_type::value_separator): case token_type::value_separator:
return ","; return ",";
case (token_type::end_of_input): case token_type::end_of_input:
return "<end of input>"; return "<end of input>";
default: case token_type::parse_error:
return "<parse error>"; return "<parse error>";
default:
return "";
} }
} }
...@@ -6156,6 +6266,11 @@ class basic_json ...@@ -6156,6 +6266,11 @@ class basic_json
} }
break; break;
} }
default:
{
break;
}
} }
} }
else else
...@@ -6257,7 +6372,7 @@ class basic_json ...@@ -6257,7 +6372,7 @@ class basic_json
switch (last_token) switch (last_token)
{ {
case (lexer::token_type::begin_object): case lexer::token_type::begin_object:
{ {
if (keep and (not callback or (keep = callback(depth++, parse_event_t::object_start, result)))) if (keep and (not callback or (keep = callback(depth++, parse_event_t::object_start, result))))
{ {
...@@ -6335,7 +6450,7 @@ class basic_json ...@@ -6335,7 +6450,7 @@ class basic_json
return result; return result;
} }
case (lexer::token_type::begin_array): case lexer::token_type::begin_array:
{ {
if (keep and (not callback or (keep = callback(depth++, parse_event_t::array_start, result)))) if (keep and (not callback or (keep = callback(depth++, parse_event_t::array_start, result))))
{ {
...@@ -6390,14 +6505,14 @@ class basic_json ...@@ -6390,14 +6505,14 @@ class basic_json
return result; return result;
} }
case (lexer::token_type::literal_null): case lexer::token_type::literal_null:
{ {
get_token(); get_token();
result.m_type = value_t::null; result.m_type = value_t::null;
break; break;
} }
case (lexer::token_type::value_string): case lexer::token_type::value_string:
{ {
const auto s = m_lexer.get_string(); const auto s = m_lexer.get_string();
get_token(); get_token();
...@@ -6405,7 +6520,7 @@ class basic_json ...@@ -6405,7 +6520,7 @@ class basic_json
break; break;
} }
case (lexer::token_type::literal_true): case lexer::token_type::literal_true:
{ {
get_token(); get_token();
result.m_type = value_t::boolean; result.m_type = value_t::boolean;
...@@ -6413,7 +6528,7 @@ class basic_json ...@@ -6413,7 +6528,7 @@ class basic_json
break; break;
} }
case (lexer::token_type::literal_false): case lexer::token_type::literal_false:
{ {
get_token(); get_token();
result.m_type = value_t::boolean; result.m_type = value_t::boolean;
...@@ -6421,7 +6536,7 @@ class basic_json ...@@ -6421,7 +6536,7 @@ class basic_json
break; break;
} }
case (lexer::token_type::value_number): case lexer::token_type::value_number:
{ {
auto float_val = m_lexer.get_number(); auto float_val = m_lexer.get_number();
...@@ -6452,6 +6567,13 @@ class basic_json ...@@ -6452,6 +6567,13 @@ class basic_json
break; break;
} }
case lexer::token_type::end_array:
case lexer::token_type::end_object:
case lexer::token_type::end_of_input:
case lexer::token_type::name_separator:
case lexer::token_type::parse_error:
case lexer::token_type::uninitialized:
case lexer::token_type::value_separator:
default: default:
{ {
// the last token was unexpected // the last token was unexpected
......
...@@ -9263,6 +9263,11 @@ TEST_CASE("iterator_wrapper") ...@@ -9263,6 +9263,11 @@ TEST_CASE("iterator_wrapper")
CHECK(i.value() == json(2)); CHECK(i.value() == json(2));
break; break;
} }
default:
{
break;
}
} }
} }
...@@ -9291,6 +9296,11 @@ TEST_CASE("iterator_wrapper") ...@@ -9291,6 +9296,11 @@ TEST_CASE("iterator_wrapper")
CHECK(i.value() == json(2)); CHECK(i.value() == json(2));
break; break;
} }
default:
{
break;
}
} }
} }
...@@ -9319,6 +9329,11 @@ TEST_CASE("iterator_wrapper") ...@@ -9319,6 +9329,11 @@ TEST_CASE("iterator_wrapper")
CHECK(i.value() == json(2)); CHECK(i.value() == json(2));
break; break;
} }
default:
{
break;
}
} }
} }
...@@ -9347,6 +9362,11 @@ TEST_CASE("iterator_wrapper") ...@@ -9347,6 +9362,11 @@ TEST_CASE("iterator_wrapper")
CHECK(i.value() == json(2)); CHECK(i.value() == json(2));
break; break;
} }
default:
{
break;
}
} }
} }
...@@ -9378,6 +9398,11 @@ TEST_CASE("iterator_wrapper") ...@@ -9378,6 +9398,11 @@ TEST_CASE("iterator_wrapper")
CHECK(i.value() == "B"); CHECK(i.value() == "B");
break; break;
} }
default:
{
break;
}
} }
} }
...@@ -9406,6 +9431,11 @@ TEST_CASE("iterator_wrapper") ...@@ -9406,6 +9431,11 @@ TEST_CASE("iterator_wrapper")
CHECK(i.value() == "B"); CHECK(i.value() == "B");
break; break;
} }
default:
{
break;
}
} }
} }
...@@ -9434,6 +9464,11 @@ TEST_CASE("iterator_wrapper") ...@@ -9434,6 +9464,11 @@ TEST_CASE("iterator_wrapper")
CHECK(i.value() == "B"); CHECK(i.value() == "B");
break; break;
} }
default:
{
break;
}
} }
} }
...@@ -9462,6 +9497,11 @@ TEST_CASE("iterator_wrapper") ...@@ -9462,6 +9497,11 @@ TEST_CASE("iterator_wrapper")
CHECK(i.value() == "B"); CHECK(i.value() == "B");
break; break;
} }
default:
{
break;
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment