#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/detail/node_iterator.h" #include "yaml-cpp/node/node.h" #include "yaml-cpp/node/ptr.h" #include #include namespace YAML { namespace detail { struct iterator_value; template class iterator_base { private: template friend class iterator_base; struct enabler {}; using base_type = node_iterator; 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: using iterator_category = std::forward_iterator_tag; using value_type = V; using difference_type = std::ptrdiff_t; using pointer = V*; using reference = V; public: iterator_base() : m_iterator(), m_pMemory() {} explicit iterator_base(base_type rhs, shared_memory_holder pMemory) : m_iterator(rhs), m_pMemory(pMemory) {} template iterator_base(const iterator_base& rhs, typename std::enable_if::value, enabler>::type = enabler()) : m_iterator(rhs.m_iterator), m_pMemory(rhs.m_pMemory) {} iterator_base& operator++() { ++m_iterator; return *this; } iterator_base operator++(int) { iterator_base iterator_pre(*this); ++(*this); return iterator_pre; } template bool operator==(const iterator_base& rhs) const { return m_iterator == rhs.m_iterator; } template bool operator!=(const iterator_base& rhs) const { 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) return value_type(Node(*v.first, m_pMemory), Node(*v.second, m_pMemory)); return value_type(); } proxy operator->() const { return proxy(**this); } private: base_type m_iterator; shared_memory_holder m_pMemory; }; } // namespace detail } // namespace YAML #endif // VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66