From ce39330ff8529265a995d1aa155259508259ff18 Mon Sep 17 00:00:00 2001 From: HenryLee Date: Tue, 30 May 2017 20:23:25 +1000 Subject: [PATCH] Add converting constructors for iterator --- src/json.hpp | 64 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index 486b9c6c1..c66b45f0f 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -8053,42 +8053,58 @@ class basic_json } } - /* - Use operator `const_iterator` instead of `const_iterator(const iterator& - other) noexcept` to avoid two class definitions for @ref iterator and - @ref const_iterator. - - This function is only called if this class is an @ref iterator. If this - class is a @ref const_iterator this function is not called. + /*! + @note The conventional copy constructor is not defined. It is replaced + by either of the following two converting constructors. + They support copy from iterator to iterator, + copy from const iterator to const iterator, + and conversion from iterator to const iterator. + However conversion from const iterator to iterator is not defined. */ - operator const_iterator() const - { - const_iterator ret; - - if (m_object) - { - ret.m_object = m_object; - ret.m_it = m_it; - } - - return ret; - } /*! - @brief copy constructor - @param[in] other iterator to copy from + @brief converting constructor + @param[in] other non-const iterator to copy from @note It is not checked whether @a other is initialized. */ - iter_impl(const iter_impl& other) noexcept + iter_impl(const iter_impl& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting constructor + @param[in] other const iterator to copy from + @note It is not checked whether @a other is initialized. + */ + iter_impl(const iter_impl& other) noexcept : m_object(other.m_object), m_it(other.m_it) {} /*! @brief copy assignment - @param[in,out] other iterator to copy from + @param[in,out] other non-const iterator to copy from + @return const/non-const iterator @note It is not checked whether @a other is initialized. */ - iter_impl& operator=(iter_impl other) noexcept( + iter_impl& operator=(iter_impl other) noexcept( + std::is_nothrow_move_constructible::value and + std::is_nothrow_move_assignable::value and + std::is_nothrow_move_constructible::value and + std::is_nothrow_move_assignable::value + ) + { + std::swap(m_object, other.m_object); + std::swap(m_it, other.m_it); + return *this; + } + + /*! + @brief copy assignment + @param[in,out] other const iterator to copy from + @return const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(iter_impl other) noexcept( std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value and std::is_nothrow_move_constructible::value and