Free Electron
detail/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>
23 class iterator_base {
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->() { return std::addressof(m_ref); }
34  operator V*() { return std::addressof(m_ref); }
35 
36  V m_ref;
37  };
38 
39  public:
40  using iterator_category = std::forward_iterator_tag;
41  using value_type = V;
42  using difference_type = std::ptrdiff_t;
43  using pointer = V*;
44  using reference = V;
45 
46  public:
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) {}
50 
51  template <class W>
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) {}
56 
57  iterator_base<V>& operator++() {
58  ++m_iterator;
59  return *this;
60  }
61 
62  iterator_base<V> operator++(int) {
63  iterator_base<V> iterator_pre(*this);
64  ++(*this);
65  return iterator_pre;
66  }
67 
68  template <typename W>
69  bool operator==(const iterator_base<W>& rhs) const {
70  return m_iterator == rhs.m_iterator;
71  }
72 
73  template <typename W>
74  bool operator!=(const iterator_base<W>& rhs) const {
75  return m_iterator != rhs.m_iterator;
76  }
77 
78  value_type operator*() const {
79  const typename base_type::value_type& v = *m_iterator;
80  if (v.pNode)
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));
84  return value_type();
85  }
86 
87  proxy operator->() const { return proxy(**this); }
88 
89  private:
90  base_type m_iterator;
91  shared_memory_holder m_pMemory;
92 };
93 } // namespace detail
94 } // namespace YAML
95 
96 #endif // VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66
Definition: anchor.h:12