From 5fc9ef2b901d24b312b2fd4bf787b678e30c4599 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20DELRIEU?= Date: Mon, 14 Aug 2017 17:26:22 +0200 Subject: [PATCH] add detail/iterators/iteration_proxy.hpp --- Makefile | 3 +- src/detail/iterators/iteration_proxy.hpp | 99 ++++++++++++++++++++++++ src/json.hpp | 87 +-------------------- 3 files changed, 102 insertions(+), 87 deletions(-) create mode 100644 src/detail/iterators/iteration_proxy.hpp diff --git a/Makefile b/Makefile index f5e18015..cbe650e9 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,8 @@ SRCS = ${SRCDIR}/json.hpp \ ${SRCDIR}/detail/parsing/parser.hpp \ ${SRCDIR}/detail/iterators/primitive_iterator.hpp \ ${SRCDIR}/detail/iterators/internal_iterator.hpp \ - ${SRCDIR}/detail/iterators/iter_impl.hpp + ${SRCDIR}/detail/iterators/iter_impl.hpp \ + ${SRCDIR}/detail/iterators/iteration_proxy.hpp diff --git a/src/detail/iterators/iteration_proxy.hpp b/src/detail/iterators/iteration_proxy.hpp new file mode 100644 index 00000000..6a13f39d --- /dev/null +++ b/src/detail/iterators/iteration_proxy.hpp @@ -0,0 +1,99 @@ +#ifndef NLOHMANN_JSON_DETAIL_ITERATORS_ITERATION_PROXY_HPP +#define NLOHMANN_JSON_DETAIL_ITERATORS_ITERATION_PROXY_HPP + +#include +#include + +namespace nlohmann +{ +namespace detail +{ +/// proxy class for the iterator_wrapper functions +template class iteration_proxy +{ + private: + /// helper class for iteration + class iteration_proxy_internal + { + private: + /// the iterator + IteratorType anchor; + /// an index for arrays (used to create key names) + std::size_t array_index = 0; + + public: + explicit iteration_proxy_internal(IteratorType it) noexcept : anchor(it) {} + + /// dereference operator (needed for range-based for) + iteration_proxy_internal& operator*() + { + return *this; + } + + /// increment operator (needed for range-based for) + iteration_proxy_internal& operator++() + { + ++anchor; + ++array_index; + + return *this; + } + + /// inequality operator (needed for range-based for) + bool operator!=(const iteration_proxy_internal& o) const noexcept + { + return anchor != o.anchor; + } + + /// return key of the iterator + std::string key() const + { + assert(anchor.m_object != nullptr); + + switch (anchor.m_object->type()) + { + // use integer array index as key + case value_t::array: + return std::to_string(array_index); + + // use key from the object + case value_t::object: + return anchor.key(); + + // use an empty key for all primitive types + default: + return ""; + } + } + + /// return value of the iterator + typename IteratorType::reference value() const + { + return anchor.value(); + } + }; + + /// the container to iterate + typename IteratorType::reference container; + + public: + /// construct iteration proxy from a container + explicit iteration_proxy(typename IteratorType::reference cont) + : container(cont) {} + + /// return iterator begin (needed for range-based for) + iteration_proxy_internal begin() noexcept + { + return iteration_proxy_internal(container.begin()); + } + + /// return iterator end (needed for range-based for) + iteration_proxy_internal end() noexcept + { + return iteration_proxy_internal(container.end()); + } +}; +} +} + +#endif diff --git a/src/json.hpp b/src/json.hpp index fbaffd87..eb61f34a 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -63,6 +63,7 @@ SOFTWARE. #include "detail/iterators/primitive_iterator.hpp" #include "detail/iterators/internal_iterator.hpp" #include "detail/iterators/iter_impl.hpp" +#include "detail/iterators/iteration_proxy.hpp" /*! @brief namespace for Niels Lohmann @@ -77,92 +78,6 @@ namespace detail // iterators // /////////////// -/// proxy class for the iterator_wrapper functions -template class iteration_proxy -{ - private: - /// helper class for iteration - class iteration_proxy_internal - { - private: - /// the iterator - IteratorType anchor; - /// an index for arrays (used to create key names) - std::size_t array_index = 0; - - public: - explicit iteration_proxy_internal(IteratorType it) noexcept : anchor(it) {} - - /// dereference operator (needed for range-based for) - iteration_proxy_internal& operator*() - { - return *this; - } - - /// increment operator (needed for range-based for) - iteration_proxy_internal& operator++() - { - ++anchor; - ++array_index; - - return *this; - } - - /// inequality operator (needed for range-based for) - bool operator!=(const iteration_proxy_internal& o) const noexcept - { - return anchor != o.anchor; - } - - /// return key of the iterator - std::string key() const - { - assert(anchor.m_object != nullptr); - - switch (anchor.m_object->type()) - { - // use integer array index as key - case value_t::array: - return std::to_string(array_index); - - // use key from the object - case value_t::object: - return anchor.key(); - - // use an empty key for all primitive types - default: - return ""; - } - } - - /// return value of the iterator - typename IteratorType::reference value() const - { - return anchor.value(); - } - }; - - /// the container to iterate - typename IteratorType::reference container; - - public: - /// construct iteration proxy from a container - explicit iteration_proxy(typename IteratorType::reference cont) - : container(cont) {} - - /// return iterator begin (needed for range-based for) - iteration_proxy_internal begin() noexcept - { - return iteration_proxy_internal(container.begin()); - } - - /// return iterator end (needed for range-based for) - iteration_proxy_internal end() noexcept - { - return iteration_proxy_internal(container.end()); - } -}; - /*! @brief a template for a reverse iterator class