| #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 <cstddef> | |
| #include <iterator> | |
| namespace YAML { | |
| namespace detail { | |
| struct iterator_value; | |
| template <typename V> | |
| class iterator_base { | |
| private: | |
| template <typename> | |
| 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 <class W> | |
| iterator_base(const iterator_base<W>& rhs, | |
| typename std::enable_if<std::is_convertible<W*, V*>::value, | |
| enabler>::type = enabler()) | |
| : m_iterator(rhs.m_iterator), m_pMemory(rhs.m_pMemory) {} | |
| iterator_base<V>& operator++() { | |
| ++m_iterator; | |
| return *this; | |
| } | |
| iterator_base<V> operator++(int) { | |
| iterator_base<V> iterator_pre(*this); | |
| ++(*this); | |
| return iterator_pre; | |
| } | |
| template <typename W> | |
| bool operator==(const iterator_base<W>& rhs) const { | |
| return m_iterator == rhs.m_iterator; | |
| } | |
| template <typename W> | |
| bool operator!=(const iterator_base<W>& 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 |