From c4e399ce0a9cb644234c54cf4bd3766245cd5de5 Mon Sep 17 00:00:00 2001 From: HenryLee Date: Sat, 27 May 2017 01:42:38 +1000 Subject: [PATCH] Override n + iterator operator in the iterator --- src/json.hpp.re2c | 15 +++++++++++++-- test/src/unit-iterators2.cpp | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index a42daba6a..c8e6bfca0 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -9317,18 +9317,29 @@ class basic_json @brief add to iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ - iter_impl operator+(difference_type i) + iter_impl operator+(difference_type i) const { auto result = *this; result += i; return result; } + /*! + @brief addition of distance and iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + friend iter_impl operator+(difference_type i, const iter_impl& it) + { + auto result = it; + result += i; + return result; + } + /*! @brief subtract from iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ - iter_impl operator-(difference_type i) + iter_impl operator-(difference_type i) const { auto result = *this; result -= i; diff --git a/test/src/unit-iterators2.cpp b/test/src/unit-iterators2.cpp index b2bc4a382..55ffd2301 100644 --- a/test/src/unit-iterators2.cpp +++ b/test/src/unit-iterators2.cpp @@ -269,6 +269,16 @@ TEST_CASE("iterators 2") CHECK_THROWS_AS(it + 1, std::domain_error); CHECK_THROWS_WITH(it + 1, "cannot use offsets with object iterators"); } + { + auto it = j_object.begin(); + CHECK_THROWS_AS(1 + it, std::domain_error); + CHECK_THROWS_WITH(1 + it, "cannot use offsets with object iterators"); + } + { + auto it = j_object.cbegin(); + CHECK_THROWS_AS(1 + it, std::domain_error); + CHECK_THROWS_WITH(1 + it, "cannot use offsets with object iterators"); + } { auto it = j_object.begin(); CHECK_THROWS_AS(it -= 1, std::domain_error); @@ -688,6 +698,16 @@ TEST_CASE("iterators 2") CHECK_THROWS_AS(it + 1, std::domain_error); CHECK_THROWS_WITH(it + 1, "cannot use offsets with object iterators"); } + { + auto it = j_object.rbegin(); + CHECK_THROWS_AS(1 + it, std::domain_error); + CHECK_THROWS_WITH(1 + it, "cannot use offsets with object iterators"); + } + { + auto it = j_object.crbegin(); + CHECK_THROWS_AS(1 + it, std::domain_error); + CHECK_THROWS_WITH(1 + it, "cannot use offsets with object iterators"); + } { auto it = j_object.rbegin(); CHECK_THROWS_AS(it -= 1, std::domain_error);