replace some raw loops with algorithms

This commit is contained in:
Niels 2016-06-28 22:49:05 +02:00
parent 7ffa07e3a3
commit fc7f4b8fba
2 changed files with 54 additions and 70 deletions

View file

@ -46,6 +46,7 @@ SOFTWARE.
#include <limits> #include <limits>
#include <map> #include <map>
#include <memory> #include <memory>
#include <numeric>
#include <sstream> #include <sstream>
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
@ -1554,22 +1555,13 @@ class basic_json
bool type_deduction = true, bool type_deduction = true,
value_t manual_type = value_t::array) value_t manual_type = value_t::array)
{ {
// the initializer list could describe an object
bool is_an_object = true;
// check if each element is an array with two elements whose first // check if each element is an array with two elements whose first
// element is a string // element is a string
for (const auto& element : init) bool is_an_object = std::all_of(init.begin(), init.end(),
[](const basic_json & element)
{ {
if (not element.is_array() or element.size() != 2 return element.is_array() and element.size() == 2 and element[0].is_string();
or not element[0].is_string()) });
{
// we found an element that makes it impossible to use the
// initializer list as object
is_an_object = false;
break;
}
}
// adjust type if type deduction is not wanted // adjust type if type deduction is not wanted
if (not type_deduction) if (not type_deduction)
@ -1595,10 +1587,10 @@ class basic_json
assert(m_value.object != nullptr); assert(m_value.object != nullptr);
for (auto& element : init) std::for_each(init.begin(), init.end(), [this](const basic_json & element)
{ {
m_value.object->emplace(*(element[0].m_value.string), element[1]); m_value.object->emplace(*(element[0].m_value.string), element[1]);
} });
} }
else else
{ {
@ -3235,11 +3227,13 @@ class basic_json
// operator[] only works for arrays // operator[] only works for arrays
if (is_array()) if (is_array())
{ {
// fill up array with null values until given idx is reached // fill up array with null values if given idx is outside range
assert(m_value.array != nullptr); assert(m_value.array != nullptr);
for (size_t i = m_value.array->size(); i <= idx; ++i) if (idx >= m_value.array->size())
{ {
m_value.array->push_back(basic_json()); m_value.array->insert(m_value.array->end(),
idx - m_value.array->size() + 1,
basic_json());
} }
return m_value.array->operator[](idx); return m_value.array->operator[](idx);
@ -5832,9 +5826,8 @@ class basic_json
*/ */
static std::size_t extra_space(const string_t& s) noexcept static std::size_t extra_space(const string_t& s) noexcept
{ {
std::size_t result = 0; return std::accumulate(s.begin(), s.end(), size_t{},
[](size_t res, typename string_t::value_type c)
for (const auto& c : s)
{ {
switch (c) switch (c)
{ {
@ -5847,8 +5840,7 @@ class basic_json
case '\t': case '\t':
{ {
// from c (1 byte) to \x (2 bytes) // from c (1 byte) to \x (2 bytes)
result += 1; return res + 1;
break;
} }
default: default:
@ -5856,14 +5848,15 @@ class basic_json
if (c >= 0x00 and c <= 0x1f) if (c >= 0x00 and c <= 0x1f)
{ {
// from c (1 byte) to \uxxxx (6 bytes) // from c (1 byte) to \uxxxx (6 bytes)
result += 5; return res + 5;
}
else
{
return res;
} }
break;
} }
} }
} });
return result;
} }
/*! /*!
@ -8778,14 +8771,13 @@ basic_json_parser_63:
*/ */
std::string to_string() const noexcept std::string to_string() const noexcept
{ {
std::string result; return std::accumulate(reference_tokens.begin(),
reference_tokens.end(), std::string{},
for (const auto& reference_token : reference_tokens) [](const std::string & a,
const std::string & b)
{ {
result += "/" + escape(reference_token); return a + "/" + escape(b);
} });
return result;
} }
/// @copydoc to_string() /// @copydoc to_string()

View file

@ -46,6 +46,7 @@ SOFTWARE.
#include <limits> #include <limits>
#include <map> #include <map>
#include <memory> #include <memory>
#include <numeric>
#include <sstream> #include <sstream>
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
@ -1554,22 +1555,13 @@ class basic_json
bool type_deduction = true, bool type_deduction = true,
value_t manual_type = value_t::array) value_t manual_type = value_t::array)
{ {
// the initializer list could describe an object
bool is_an_object = true;
// check if each element is an array with two elements whose first // check if each element is an array with two elements whose first
// element is a string // element is a string
for (const auto& element : init) bool is_an_object = std::all_of(init.begin(), init.end(),
[](const basic_json & element)
{ {
if (not element.is_array() or element.size() != 2 return element.is_array() and element.size() == 2 and element[0].is_string();
or not element[0].is_string()) });
{
// we found an element that makes it impossible to use the
// initializer list as object
is_an_object = false;
break;
}
}
// adjust type if type deduction is not wanted // adjust type if type deduction is not wanted
if (not type_deduction) if (not type_deduction)
@ -1595,10 +1587,10 @@ class basic_json
assert(m_value.object != nullptr); assert(m_value.object != nullptr);
for (auto& element : init) std::for_each(init.begin(), init.end(), [this](const basic_json & element)
{ {
m_value.object->emplace(*(element[0].m_value.string), element[1]); m_value.object->emplace(*(element[0].m_value.string), element[1]);
} });
} }
else else
{ {
@ -3235,11 +3227,13 @@ class basic_json
// operator[] only works for arrays // operator[] only works for arrays
if (is_array()) if (is_array())
{ {
// fill up array with null values until given idx is reached // fill up array with null values if given idx is outside range
assert(m_value.array != nullptr); assert(m_value.array != nullptr);
for (size_t i = m_value.array->size(); i <= idx; ++i) if (idx >= m_value.array->size())
{ {
m_value.array->push_back(basic_json()); m_value.array->insert(m_value.array->end(),
idx - m_value.array->size() + 1,
basic_json());
} }
return m_value.array->operator[](idx); return m_value.array->operator[](idx);
@ -5832,9 +5826,8 @@ class basic_json
*/ */
static std::size_t extra_space(const string_t& s) noexcept static std::size_t extra_space(const string_t& s) noexcept
{ {
std::size_t result = 0; return std::accumulate(s.begin(), s.end(), size_t{},
[](size_t res, typename string_t::value_type c)
for (const auto& c : s)
{ {
switch (c) switch (c)
{ {
@ -5847,8 +5840,7 @@ class basic_json
case '\t': case '\t':
{ {
// from c (1 byte) to \x (2 bytes) // from c (1 byte) to \x (2 bytes)
result += 1; return res + 1;
break;
} }
default: default:
@ -5856,14 +5848,15 @@ class basic_json
if (c >= 0x00 and c <= 0x1f) if (c >= 0x00 and c <= 0x1f)
{ {
// from c (1 byte) to \uxxxx (6 bytes) // from c (1 byte) to \uxxxx (6 bytes)
result += 5; return res + 5;
}
else
{
return res;
} }
break;
} }
} }
} });
return result;
} }
/*! /*!
@ -8088,14 +8081,13 @@ class basic_json
*/ */
std::string to_string() const noexcept std::string to_string() const noexcept
{ {
std::string result; return std::accumulate(reference_tokens.begin(),
reference_tokens.end(), std::string{},
for (const auto& reference_token : reference_tokens) [](const std::string & a,
const std::string & b)
{ {
result += "/" + escape(reference_token); return a + "/" + escape(b);
} });
return result;
} }
/// @copydoc to_string() /// @copydoc to_string()