Commit 4fbff7d1 authored by Florian Weber's avatar Florian Weber

simplify value_t::operator< by using a lookup-table

parent f5e95522
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#define NLOHMANN_JSON_HPP #define NLOHMANN_JSON_HPP
#include <algorithm> #include <algorithm>
#include <array>
#include <ciso646> #include <ciso646>
#include <cmath> #include <cmath>
#include <cstdio> #include <cstdio>
...@@ -202,76 +203,17 @@ class basic_json ...@@ -202,76 +203,17 @@ class basic_json
*/ */
friend bool operator<(const value_t lhs, const value_t rhs) friend bool operator<(const value_t lhs, const value_t rhs)
{ {
// no type is smaller than itself std::array<uint8_t, 7> order = {{
if (lhs == rhs) 0, // null
{ 3, // object
return false; 4, // array
} 5, // string
1, // boolean
switch (lhs) 2, // integer
{ 2 // float
case (value_t::null):
{
// nulls are smaller than all other types
return true;
}
case (value_t::boolean):
{
// only nulls are smaller than booleans
return (rhs != value_t::null);
}
case (value_t::number_float):
case (value_t::number_integer):
{
switch (rhs)
{
// numbers are smaller than objects, arrays, and string
case (value_t::object):
case (value_t::array):
case (value_t::string):
{
return true;
}
default:
{
return false;
}
}
} }
};
case (value_t::object): return order[static_cast<std::size_t>(lhs)] < order[static_cast<std::size_t>(rhs)];
{
switch (rhs)
{
// objects are smaller than arrays and string
case (value_t::array):
case (value_t::string):
{
return true;
}
default:
{
return false;
}
}
}
case (value_t::array):
{
// arrays are smaller than strings
return (rhs == value_t::string);
}
default:
{
// a string is not smaller than any other types
return false;
}
}
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#define NLOHMANN_JSON_HPP #define NLOHMANN_JSON_HPP
#include <algorithm> #include <algorithm>
#include <array>
#include <ciso646> #include <ciso646>
#include <cmath> #include <cmath>
#include <cstdio> #include <cstdio>
...@@ -202,76 +203,17 @@ class basic_json ...@@ -202,76 +203,17 @@ class basic_json
*/ */
friend bool operator<(const value_t lhs, const value_t rhs) friend bool operator<(const value_t lhs, const value_t rhs)
{ {
// no type is smaller than itself std::array<uint8_t, 7> order = {{
if (lhs == rhs) 0, // null
{ 3, // object
return false; 4, // array
} 5, // string
1, // boolean
switch (lhs) 2, // integer
{ 2 // float
case (value_t::null):
{
// nulls are smaller than all other types
return true;
}
case (value_t::boolean):
{
// only nulls are smaller than booleans
return (rhs != value_t::null);
}
case (value_t::number_float):
case (value_t::number_integer):
{
switch (rhs)
{
// numbers are smaller than objects, arrays, and string
case (value_t::object):
case (value_t::array):
case (value_t::string):
{
return true;
}
default:
{
return false;
}
}
} }
};
case (value_t::object): return order[static_cast<std::size_t>(lhs)] < order[static_cast<std::size_t>(rhs)];
{
switch (rhs)
{
// objects are smaller than arrays and string
case (value_t::array):
case (value_t::string):
{
return true;
}
default:
{
return false;
}
}
}
case (value_t::array):
{
// arrays are smaller than strings
return (rhs == value_t::string);
}
default:
{
// a string is not smaller than any other types
return false;
}
}
} }
......
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