🔨 cleanup + some noexcept

This commit is contained in:
Niels Lohmann 2018-01-16 20:41:04 +01:00
parent b182308eff
commit afe4571309
No known key found for this signature in database
GPG key ID: 7F3CEA63AE251B69
4 changed files with 28 additions and 35 deletions

View file

@ -79,7 +79,7 @@ template<typename IteratorType> class iteration_proxy
public: public:
/// construct iteration proxy from a container /// construct iteration proxy from a container
explicit iteration_proxy(typename IteratorType::reference cont) explicit iteration_proxy(typename IteratorType::reference cont) noexcept
: container(cont) {} : container(cont) {}
/// return iterator begin (needed for range-based for) /// return iterator begin (needed for range-based for)

View file

@ -1,9 +1,7 @@
#pragma once #pragma once
#include <ciso646> // not
#include <cstddef> // ptrdiff_t #include <cstddef> // ptrdiff_t
#include <limits> // numeric_limits #include <limits> // numeric_limits
#include <ostream> // ostream
namespace nlohmann namespace nlohmann
{ {
@ -20,9 +18,15 @@ end_value (`1`) models past the end.
*/ */
class primitive_iterator_t class primitive_iterator_t
{ {
public: private:
using difference_type = std::ptrdiff_t; using difference_type = std::ptrdiff_t;
static constexpr difference_type begin_value = 0;
static constexpr difference_type end_value = begin_value + 1;
/// iterator as signed integer type
difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();
public:
constexpr difference_type get_value() const noexcept constexpr difference_type get_value() const noexcept
{ {
return m_it; return m_it;
@ -62,10 +66,10 @@ class primitive_iterator_t
return lhs.m_it < rhs.m_it; return lhs.m_it < rhs.m_it;
} }
primitive_iterator_t operator+(difference_type i) primitive_iterator_t operator+(difference_type n) noexcept
{ {
auto result = *this; auto result = *this;
result += i; result += n;
return result; return result;
} }
@ -74,55 +78,43 @@ class primitive_iterator_t
return lhs.m_it - rhs.m_it; return lhs.m_it - rhs.m_it;
} }
friend std::ostream& operator<<(std::ostream& os, primitive_iterator_t it) primitive_iterator_t& operator++() noexcept
{
return os << it.m_it;
}
primitive_iterator_t& operator++()
{ {
++m_it; ++m_it;
return *this; return *this;
} }
primitive_iterator_t const operator++(int) primitive_iterator_t const operator++(int) noexcept
{ {
auto result = *this; auto result = *this;
m_it++; m_it++;
return result; return result;
} }
primitive_iterator_t& operator--() primitive_iterator_t& operator--() noexcept
{ {
--m_it; --m_it;
return *this; return *this;
} }
primitive_iterator_t const operator--(int) primitive_iterator_t const operator--(int) noexcept
{ {
auto result = *this; auto result = *this;
m_it--; m_it--;
return result; return result;
} }
primitive_iterator_t& operator+=(difference_type n) primitive_iterator_t& operator+=(difference_type n) noexcept
{ {
m_it += n; m_it += n;
return *this; return *this;
} }
primitive_iterator_t& operator-=(difference_type n) primitive_iterator_t& operator-=(difference_type n) noexcept
{ {
m_it -= n; m_it -= n;
return *this; return *this;
} }
private:
static constexpr difference_type begin_value = 0;
static constexpr difference_type end_value = begin_value + 1;
/// iterator as signed integer type
difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();
}; };
} }
} }

View file

@ -1,7 +1,5 @@
#pragma once #pragma once
#include <ciso646> // not
// This file contains all internal macro definitions // This file contains all internal macro definitions
// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them // You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them
@ -38,7 +36,7 @@
#endif #endif
// allow to disable exceptions // allow to disable exceptions
#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && not defined(JSON_NOEXCEPTION) #if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)
#define JSON_THROW(exception) throw exception #define JSON_THROW(exception) throw exception
#define JSON_TRY try #define JSON_TRY try
#define JSON_CATCH(exception) catch(exception) #define JSON_CATCH(exception) catch(exception)

View file

@ -1301,7 +1301,7 @@ class basic_json
array = create<array_t>(std::move(value)); array = create<array_t>(std::move(value));
} }
void destroy(value_t t) void destroy(value_t t) noexcept
{ {
switch (t) switch (t)
{ {
@ -1346,7 +1346,7 @@ class basic_json
value is changed, because the invariant expresses a relationship between value is changed, because the invariant expresses a relationship between
@a m_type and @a m_value. @a m_type and @a m_value.
*/ */
void assert_invariant() const void assert_invariant() const noexcept
{ {
assert(m_type != value_t::object or m_value.object != nullptr); assert(m_type != value_t::object or m_value.object != nullptr);
assert(m_type != value_t::array or m_value.array != nullptr); assert(m_type != value_t::array or m_value.array != nullptr);
@ -2140,7 +2140,7 @@ class basic_json
@since version 1.0.0 @since version 1.0.0
*/ */
~basic_json() ~basic_json() noexcept
{ {
assert_invariant(); assert_invariant();
m_value.destroy(m_type); m_value.destroy(m_type);
@ -4481,7 +4481,7 @@ class basic_json
@note The name of this function is not yet final and may change in the @note The name of this function is not yet final and may change in the
future. future.
*/ */
static iteration_proxy<iterator> iterator_wrapper(reference ref) static iteration_proxy<iterator> iterator_wrapper(reference ref) noexcept
{ {
return iteration_proxy<iterator>(ref); return iteration_proxy<iterator>(ref);
} }
@ -4489,7 +4489,7 @@ class basic_json
/*! /*!
@copydoc iterator_wrapper(reference) @copydoc iterator_wrapper(reference)
*/ */
static iteration_proxy<const_iterator> iterator_wrapper(const_reference ref) static iteration_proxy<const_iterator> iterator_wrapper(const_reference ref) noexcept
{ {
return iteration_proxy<const_iterator>(ref); return iteration_proxy<const_iterator>(ref);
} }
@ -4531,7 +4531,8 @@ class basic_json
@endcode @endcode
@note When iterating over an array, `key()` will return the index of the @note When iterating over an array, `key()` will return the index of the
element as string (see example). element as string (see example). For primitive types (e.g., numbers),
`key()` returns an empty string.
@return iteration proxy object wrapping @a ref with an interface to use in @return iteration proxy object wrapping @a ref with an interface to use in
range-based for loops range-based for loops
@ -4542,8 +4543,10 @@ class basic_json
changes in the JSON value. changes in the JSON value.
@complexity Constant. @complexity Constant.
@since version 3.x.x.
*/ */
iteration_proxy<iterator> items() iteration_proxy<iterator> items() noexcept
{ {
return iteration_proxy<iterator>(*this); return iteration_proxy<iterator>(*this);
} }
@ -4551,7 +4554,7 @@ class basic_json
/*! /*!
@copydoc items() @copydoc items()
*/ */
iteration_proxy<const_iterator> items() const iteration_proxy<const_iterator> items() const noexcept
{ {
return iteration_proxy<const_iterator>(*this); return iteration_proxy<const_iterator>(*this);
} }