1 #ifndef VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 2 #define VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 4 #if defined(_MSC_VER) || \ 5 (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \ 6 (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 10 #include "yaml-cpp/dll.h" 11 #include "yaml-cpp/node/detail/node_iterator.h" 12 #include "yaml-cpp/node/node.h" 13 #include "yaml-cpp/node/ptr.h" 20 struct iterator_value;
27 friend class iterator_base;
29 using base_type = node_iterator;
32 explicit proxy(
const V& x) : m_ref(x) {}
33 V* operator->() {
return std::addressof(m_ref); }
34 operator V*() {
return std::addressof(m_ref); }
40 using iterator_category = std::forward_iterator_tag;
42 using difference_type = std::ptrdiff_t;
47 iterator_base() : m_iterator(), m_pMemory() {}
48 explicit iterator_base(base_type rhs, shared_memory_holder pMemory)
49 : m_iterator(rhs), m_pMemory(pMemory) {}
52 iterator_base(
const iterator_base<W>& rhs,
53 typename std::enable_if<std::is_convertible<W*, V*>::value,
54 enabler>::type = enabler())
55 : m_iterator(rhs.m_iterator), m_pMemory(rhs.m_pMemory) {}
57 iterator_base<V>& operator++() {
62 iterator_base<V> operator++(
int) {
63 iterator_base<V> iterator_pre(*
this);
69 bool operator==(
const iterator_base<W>& rhs)
const {
70 return m_iterator == rhs.m_iterator;
74 bool operator!=(
const iterator_base<W>& rhs)
const {
75 return m_iterator != rhs.m_iterator;
78 value_type operator*()
const {
79 const typename base_type::value_type& v = *m_iterator;
81 return value_type(Node(*v, m_pMemory));
82 if (v.first && v.second)
83 return value_type(Node(*v.first, m_pMemory), Node(*v.second, m_pMemory));
87 proxy operator->()
const {
return proxy(**
this); }
91 shared_memory_holder m_pMemory;
96 #endif // VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66