My Project
iterator.h
1 #ifndef VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66
2 #define VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66
3 
4 #if defined(_MSC_VER) || \
5  (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
6  (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
7 #pragma once
8 #endif
9 
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"
14 #include <cstddef>
15 #include <iterator>
16 
17 
18 namespace YAML {
19 namespace detail {
20 struct iterator_value;
21 
22 template <typename V>
24 
25  private:
26  template <typename>
27  friend class iterator_base;
28  struct enabler {};
29  using base_type = node_iterator;
30 
31  struct proxy {
32  explicit proxy(const V& x) : m_ref(x) {}
33  V* operator->() YAML_ATTRIBUTE_LIFETIME_BOUND {
34  return std::addressof(m_ref);
35  }
36  operator V*() YAML_ATTRIBUTE_LIFETIME_BOUND {
37  return std::addressof(m_ref);
38  }
39 
40  V m_ref;
41  };
42 
43  public:
44  using iterator_category = std::forward_iterator_tag;
45  using value_type = V;
46  using difference_type = std::ptrdiff_t;
47  using pointer = V*;
48  using reference = V&;
49 
50  public:
51  iterator_base() : m_iterator(), m_pMemory() {}
52  explicit iterator_base(base_type rhs, shared_memory_holder pMemory)
53  : m_iterator(rhs), m_pMemory(pMemory) {}
54 
55  template <class W>
57  typename std::enable_if<std::is_convertible<W*, V*>::value,
58  enabler>::type = enabler())
59  : m_iterator(rhs.m_iterator), m_pMemory(rhs.m_pMemory) {}
60 
61  iterator_base<V>& operator++() {
62  ++m_iterator;
63  return *this;
64  }
65 
66  iterator_base<V> operator++(int) {
67  iterator_base<V> iterator_pre(*this);
68  ++(*this);
69  return iterator_pre;
70  }
71 
72  template <typename W>
73  bool operator==(const iterator_base<W>& rhs) const {
74  return m_iterator == rhs.m_iterator;
75  }
76 
77  template <typename W>
78  bool operator!=(const iterator_base<W>& rhs) const {
79  return m_iterator != rhs.m_iterator;
80  }
81 
82  value_type operator*() const YAML_ATTRIBUTE_LIFETIME_BOUND {
83  const typename base_type::value_type& v = *m_iterator;
84  if (v.pNode)
85  return value_type(Node(*v, m_pMemory));
86  if (v.first && v.second)
87  return value_type(Node(*v.first, m_pMemory), Node(*v.second, m_pMemory));
88  return value_type();
89  }
90 
91  proxy operator->() const YAML_ATTRIBUTE_LIFETIME_BOUND {
92  return proxy(**this);
93  }
94 
95  private:
96  base_type m_iterator;
97  shared_memory_holder m_pMemory;
98 };
99 } // namespace detail
100 } // namespace YAML
101 
102 #endif // VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66
Definition: node_iterator.h:26
Definition: node_iterator.h:55
Definition: iterator.h:23
Definition: anchor.h:12
Definition: node.h:29