diff --git a/include/yaml-cpp/node/detail/iterator.h b/include/yaml-cpp/node/detail/iterator.h index 8e82576..7d2a398 100644 --- a/include/yaml-cpp/node/detail/iterator.h +++ b/include/yaml-cpp/node/detail/iterator.h @@ -10,7 +10,7 @@ #include "yaml-cpp/dll.h" #include "yaml-cpp/node/ptr.h" #include "yaml-cpp/node/detail/node_iterator.h" -#include +#include namespace YAML { namespace detail { @@ -18,13 +18,21 @@ struct iterator_value; template class iterator_base - : public boost::iterator_adaptor, node_iterator, V, - std::forward_iterator_tag, V> { + : public std::iterator { + private: template friend class iterator_base; struct enabler {}; - typedef typename iterator_base::base_type base_type; + typedef node_iterator base_type; + + struct proxy { + explicit proxy(const V& x) : m_ref(x) {} + V* operator->() { return std::addressof(m_ref); } + operator V*() { return std::addressof(m_ref); } + + V m_ref; + }; public: typedef typename iterator_base::value_type value_type; @@ -32,22 +40,28 @@ class iterator_base public: iterator_base() {} explicit iterator_base(base_type rhs, shared_memory_holder pMemory) - : iterator_base::iterator_adaptor_(rhs), m_pMemory(pMemory) {} + : m_iterator(rhs), m_pMemory(pMemory) {} template iterator_base(const iterator_base& rhs, typename std::enable_if::value, enabler>::type = enabler()) - : iterator_base::iterator_adaptor_(rhs.base()), - m_pMemory(rhs.m_pMemory) {} + : m_iterator(rhs.m_iterator), m_pMemory(rhs.m_pMemory) {} - private: - friend class boost::iterator_core_access; + iterator_base& operator++() { ++m_iterator; return *this; } - void increment() { this->base_reference() = std::next(this->base()); } + template + bool operator==(const iterator_base& rhs) { + return m_iterator == rhs.m_iterator; + } - value_type dereference() const { - const typename base_type::value_type& v = *this->base(); + template + bool operator!=(const iterator_base& rhs) { + return m_iterator != rhs.m_iterator; + } + + value_type operator*() const { + const typename base_type::value_type& v = *m_iterator; if (v.pNode) return value_type(Node(*v, m_pMemory)); if (v.first && v.second) @@ -55,7 +69,12 @@ class iterator_base return value_type(); } + value_type* operator->() const { + return proxy(**this); + } + private: + base_type m_iterator; shared_memory_holder m_pMemory; }; } diff --git a/include/yaml-cpp/node/detail/node_iterator.h b/include/yaml-cpp/node/detail/node_iterator.h index 1fa45f8..00b8804 100644 --- a/include/yaml-cpp/node/detail/node_iterator.h +++ b/include/yaml-cpp/node/detail/node_iterator.h @@ -9,7 +9,8 @@ #include "yaml-cpp/dll.h" #include "yaml-cpp/node/ptr.h" -#include +#include +#include #include #include #include @@ -51,12 +52,20 @@ struct node_iterator_type { template class node_iterator_base - : public boost::iterator_facade< - node_iterator_base, node_iterator_value, - std::forward_iterator_tag, node_iterator_value > { + : public std::iterator< + std::forward_iterator_tag, node_iterator_value, + ptrdiff_t, node_iterator_value*, node_iterator_value > { private: struct enabler {}; + struct proxy { + explicit proxy(const node_iterator_value& x) : m_ref(x) {} + node_iterator_value* operator->() { return std::addressof(m_ref); } + operator node_iterator_value*() { return std::addressof(m_ref); } + + node_iterator_value m_ref; + }; + public: typedef typename node_iterator_type::seq SeqIter; typedef typename node_iterator_type::map MapIter; @@ -86,13 +95,11 @@ class node_iterator_base m_mapIt(rhs.m_mapIt), m_mapEnd(rhs.m_mapEnd) {} - private: - friend class boost::iterator_core_access; template friend class node_iterator_base; template - bool equal(const node_iterator_base& rhs) const { + bool operator==(const node_iterator_base& rhs) const { if (m_type != rhs.m_type) return false; @@ -107,7 +114,12 @@ class node_iterator_base return true; } - void increment() { + template + bool operator!=(const node_iterator_base& rhs) const { + return !(*this==rhs); + } + + node_iterator_base& operator++() { switch (m_type) { case iterator_type::None: break; @@ -119,9 +131,10 @@ class node_iterator_base m_mapIt = increment_until_defined(m_mapIt); break; } + return *this; } - value_type dereference() const { + value_type operator*() const { switch (m_type) { case iterator_type::None: return value_type(); @@ -133,6 +146,10 @@ class node_iterator_base return value_type(); } + value_type* operator->() const { + return proxy(**this); + } + MapIter increment_until_defined(MapIter it) { while (it != m_mapEnd && !is_defined(it)) ++it;