#ifndef VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #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 { struct iterator_value; template class iterator_base: public boost::iterator_adaptor< iterator_base, node_iterator, V, std::forward_iterator_tag, V> { private: template friend class iterator_base; struct enabler {}; typedef typename iterator_base::base_type base_type; public: typedef typename iterator_base::value_type value_type; public: iterator_base() {} explicit iterator_base(base_type rhs, shared_memory_holder pMemory): iterator_base::iterator_adaptor_(rhs), m_pMemory(pMemory) {} template iterator_base(const iterator_base& rhs, typename boost::enable_if, enabler>::type = enabler()): iterator_base::iterator_adaptor_(rhs.base()), m_pMemory(rhs.m_pMemory) {} private: friend class boost::iterator_core_access; void increment() { this->base_reference() = boost::next(this->base()); } value_type dereference() const { const typename base_type::value_type& v = *this->base(); if(v.pNode) return value_type(Node(*v, m_pMemory)); if(v.first && v.second) return value_type(Node(*v.first, m_pMemory), Node(*v.second, m_pMemory)); return value_type(); } private: shared_memory_holder m_pMemory; }; } } #endif // VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66