From f24e4f680ebeff7fdc7a824fa83fff2c504d6638 Mon Sep 17 00:00:00 2001
From: Niels Lohmann <niels.lohmann@gmail.com>
Date: Wed, 14 Dec 2016 22:30:09 +0100
Subject: [PATCH] :art: cleanup after PR #395

---
 README.md         |  1 +
 src/json.hpp      | 35 +++++++++++++++++------------------
 src/json.hpp.re2c | 37 +++++++++++++++++++------------------
 3 files changed, 37 insertions(+), 36 deletions(-)

diff --git a/README.md b/README.md
index fa045f7f..644b37f2 100644
--- a/README.md
+++ b/README.md
@@ -584,6 +584,7 @@ I deeply appreciate the help of the following people.
 - [cgzones](https://github.com/cgzones) had an idea how to fix the Coverity scan.
 - [Jared Grubb](https://github.com/jaredgrubb) silenced a nasty documentation warning.
 - [Yixin Zhang](https://github.com/qwename) fixed an integer overflow check.
+- [Bosswestfalen](https://github.com/Bosswestfalen) merged two iterator classes into a smaller one.
 
 Thanks a lot for helping out!
 
diff --git a/src/json.hpp b/src/json.hpp
index aed03fa3..d066bd2c 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -228,6 +228,7 @@ class basic_json
 
   public:
     // forward declarations
+    template<typename U> class iter_impl;
     template<typename Base> class json_reverse_iterator;
     class json_pointer;
 
@@ -261,8 +262,6 @@ class basic_json
     /// the type of an element const pointer
     using const_pointer = typename std::allocator_traits<allocator_type>::const_pointer;
 
-    // forward declaration for iterators
-    template <typename U> class iter_impl;
     /// an iterator for a basic_json container
     using iterator = iter_impl<basic_json>;
     /// a const iterator for a basic_json container
@@ -8208,8 +8207,8 @@ class basic_json
     /*!
     @brief a template for a random access iterator for the @ref basic_json class
 
-    This class implements a both iterators (iterator and const_iterator) 
-    for the @ref basic_json class.
+    This class implements a both iterators (iterator and const_iterator) for the
+    @ref basic_json class.
 
     @note An iterator is called *initialized* when a pointer to a JSON value
           has been set (e.g., by a constructor or a copy assignment). If the
@@ -8222,9 +8221,9 @@ class basic_json
       The iterator that can be moved to point (forward and backward) to any
       element in constant time.
 
-    @since version 1.0.0
+    @since version 1.0.0, simplified in version 2.0.9
     */
-    template <typename U>
+    template<typename U>
     class iter_impl : public std::iterator<std::random_access_iterator_tag, U>
     {
         /// allow basic_json to access private members
@@ -8242,12 +8241,12 @@ class basic_json
         using difference_type = typename basic_json::difference_type;
         /// defines a pointer to the type iterated over (value_type)
         using pointer = typename std::conditional<std::is_const<U>::value,
-                                                  typename basic_json::const_pointer,
-                                                  typename basic_json::pointer>::type;
+              typename basic_json::const_pointer,
+              typename basic_json::pointer>::type;
         /// defines a reference to the type iterated over (value_type)
         using reference = typename std::conditional<std::is_const<U>::value,
-                                                    typename basic_json::const_reference,
-                                                    typename basic_json::reference>::type;
+              typename basic_json::const_reference,
+              typename basic_json::reference>::type;
         /// the category of the iterator
         using iterator_category = std::bidirectional_iterator_tag;
 
@@ -8288,19 +8287,19 @@ class basic_json
         }
 
         /*
-        Use operator const_iterator instead of 
-        const_iterator(const iterator& other) noexcept
-        to avoid two class definitions for iterator and const_iterator.
+        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 iterator.
-        If this class is a const_iterator this function is not called.
+        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.
         */
         operator const_iterator() const
-         {
-             const_iterator ret;
+        {
+            const_iterator ret;
 
             if (m_object)
-             {
+            {
                 ret.m_object = m_object;
                 ret.m_it = m_it;
             }
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index 17813c79..ded56b9f 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -228,6 +228,7 @@ class basic_json
 
   public:
     // forward declarations
+    template<typename U> class iter_impl;
     template<typename Base> class json_reverse_iterator;
     class json_pointer;
 
@@ -262,9 +263,9 @@ class basic_json
     using const_pointer = typename std::allocator_traits<allocator_type>::const_pointer;
 
     /// an iterator for a basic_json container
-    class iterator;
+    using iterator = iter_impl<basic_json>;
     /// a const iterator for a basic_json container
-    class const_iterator;
+    using const_iterator = iter_impl<const basic_json>;
     /// a reverse iterator for a basic_json container
     using reverse_iterator = json_reverse_iterator<typename basic_json::iterator>;
     /// a const reverse iterator for a basic_json container
@@ -8206,8 +8207,8 @@ class basic_json
     /*!
     @brief a template for a random access iterator for the @ref basic_json class
 
-    This class implements a both iterators (iterator and const_iterator) 
-    for the @ref basic_json class.
+    This class implements a both iterators (iterator and const_iterator) for the
+    @ref basic_json class.
 
     @note An iterator is called *initialized* when a pointer to a JSON value
           has been set (e.g., by a constructor or a copy assignment). If the
@@ -8220,9 +8221,9 @@ class basic_json
       The iterator that can be moved to point (forward and backward) to any
       element in constant time.
 
-    @since version 1.0.0
+    @since version 1.0.0, simplified in version 2.0.9
     */
-    template <typename U>
+    template<typename U>
     class iter_impl : public std::iterator<std::random_access_iterator_tag, U>
     {
         /// allow basic_json to access private members
@@ -8240,12 +8241,12 @@ class basic_json
         using difference_type = typename basic_json::difference_type;
         /// defines a pointer to the type iterated over (value_type)
         using pointer = typename std::conditional<std::is_const<U>::value,
-                                                  typename basic_json::const_pointer,
-                                                  typename basic_json::pointer>::type;
+              typename basic_json::const_pointer,
+              typename basic_json::pointer>::type;
         /// defines a reference to the type iterated over (value_type)
         using reference = typename std::conditional<std::is_const<U>::value,
-                                                    typename basic_json::const_reference,
-                                                    typename basic_json::reference>::type;
+              typename basic_json::const_reference,
+              typename basic_json::reference>::type;
         /// the category of the iterator
         using iterator_category = std::bidirectional_iterator_tag;
 
@@ -8286,19 +8287,19 @@ class basic_json
         }
 
         /*
-        Use operator const_iterator instead of 
-        const_iterator(const iterator& other) noexcept
-        to avoid two class definitions for iterator and const_iterator.
+        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 iterator.
-        If this class is a const_iterator this function is not called.
+        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.
         */
         operator const_iterator() const
-         {
-             const_iterator ret;
+        {
+            const_iterator ret;
 
             if (m_object)
-             {
+            {
                 ret.m_object = m_object;
                 ret.m_it = m_it;
             }