From afe4571309f16b7115d87bed47bd15a9e5fd44e7 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 16 Jan 2018 20:41:04 +0100 Subject: [PATCH] :hammer: cleanup + some noexcept --- develop/detail/iterators/iteration_proxy.hpp | 2 +- .../detail/iterators/primitive_iterator.hpp | 38 ++++++++----------- develop/detail/macro_scope.hpp | 4 +- develop/json.hpp | 19 ++++++---- 4 files changed, 28 insertions(+), 35 deletions(-) diff --git a/develop/detail/iterators/iteration_proxy.hpp b/develop/detail/iterators/iteration_proxy.hpp index 296101c84..08b32cafd 100644 --- a/develop/detail/iterators/iteration_proxy.hpp +++ b/develop/detail/iterators/iteration_proxy.hpp @@ -79,7 +79,7 @@ template class iteration_proxy public: /// construct iteration proxy from a container - explicit iteration_proxy(typename IteratorType::reference cont) + explicit iteration_proxy(typename IteratorType::reference cont) noexcept : container(cont) {} /// return iterator begin (needed for range-based for) diff --git a/develop/detail/iterators/primitive_iterator.hpp b/develop/detail/iterators/primitive_iterator.hpp index fd2a00cba..db0b1e7cc 100644 --- a/develop/detail/iterators/primitive_iterator.hpp +++ b/develop/detail/iterators/primitive_iterator.hpp @@ -1,9 +1,7 @@ #pragma once -#include // not #include // ptrdiff_t #include // numeric_limits -#include // ostream namespace nlohmann { @@ -20,9 +18,15 @@ end_value (`1`) models past the end. */ class primitive_iterator_t { - public: + private: 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::min)(); + + public: constexpr difference_type get_value() const noexcept { return m_it; @@ -62,10 +66,10 @@ class primitive_iterator_t 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; - result += i; + result += n; return result; } @@ -74,55 +78,43 @@ class primitive_iterator_t return lhs.m_it - rhs.m_it; } - friend std::ostream& operator<<(std::ostream& os, primitive_iterator_t it) - { - return os << it.m_it; - } - - primitive_iterator_t& operator++() + primitive_iterator_t& operator++() noexcept { ++m_it; return *this; } - primitive_iterator_t const operator++(int) + primitive_iterator_t const operator++(int) noexcept { auto result = *this; m_it++; return result; } - primitive_iterator_t& operator--() + primitive_iterator_t& operator--() noexcept { --m_it; return *this; } - primitive_iterator_t const operator--(int) + primitive_iterator_t const operator--(int) noexcept { auto result = *this; m_it--; return result; } - primitive_iterator_t& operator+=(difference_type n) + primitive_iterator_t& operator+=(difference_type n) noexcept { m_it += n; return *this; } - primitive_iterator_t& operator-=(difference_type n) + primitive_iterator_t& operator-=(difference_type n) noexcept { m_it -= n; 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::min)(); }; } } diff --git a/develop/detail/macro_scope.hpp b/develop/detail/macro_scope.hpp index f89360253..8316c077d 100644 --- a/develop/detail/macro_scope.hpp +++ b/develop/detail/macro_scope.hpp @@ -1,7 +1,5 @@ #pragma once -#include // not - // This file contains all internal macro definitions // You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them @@ -38,7 +36,7 @@ #endif // 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_TRY try #define JSON_CATCH(exception) catch(exception) diff --git a/develop/json.hpp b/develop/json.hpp index f4c139e47..320900e35 100644 --- a/develop/json.hpp +++ b/develop/json.hpp @@ -1301,7 +1301,7 @@ class basic_json array = create(std::move(value)); } - void destroy(value_t t) + void destroy(value_t t) noexcept { switch (t) { @@ -1346,7 +1346,7 @@ class basic_json value is changed, because the invariant expresses a relationship between @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::array or m_value.array != nullptr); @@ -2140,7 +2140,7 @@ class basic_json @since version 1.0.0 */ - ~basic_json() + ~basic_json() noexcept { assert_invariant(); 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 future. */ - static iteration_proxy iterator_wrapper(reference ref) + static iteration_proxy iterator_wrapper(reference ref) noexcept { return iteration_proxy(ref); } @@ -4489,7 +4489,7 @@ class basic_json /*! @copydoc iterator_wrapper(reference) */ - static iteration_proxy iterator_wrapper(const_reference ref) + static iteration_proxy iterator_wrapper(const_reference ref) noexcept { return iteration_proxy(ref); } @@ -4531,7 +4531,8 @@ class basic_json @endcode @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 range-based for loops @@ -4542,8 +4543,10 @@ class basic_json changes in the JSON value. @complexity Constant. + + @since version 3.x.x. */ - iteration_proxy items() + iteration_proxy items() noexcept { return iteration_proxy(*this); } @@ -4551,7 +4554,7 @@ class basic_json /*! @copydoc items() */ - iteration_proxy items() const + iteration_proxy items() const noexcept { return iteration_proxy(*this); }