LCOV - code coverage report
Current view: top level - usr/include/yaml-cpp/node/detail - iterator.h (source / functions) Hit Total Coverage
Test: jami-coverage-filtered.info Lines: 14 15 93.3 %
Date: 2025-08-24 09:11:10 Functions: 9 10 90.0 %

          Line data    Source code
       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          12 :   iterator_base() : m_iterator(), m_pMemory() {}
      48        2226 :   explicit iterator_base(base_type rhs, shared_memory_holder pMemory)
      49        2226 :       : 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        2844 :   iterator_base<V>& operator++() {
      58        2844 :     ++m_iterator;
      59        2844 :     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        3963 :   bool operator!=(const iterator_base<W>& rhs) const {
      75        3963 :     return m_iterator != rhs.m_iterator;
      76             :   }
      77             : 
      78        2844 :   value_type operator*() const {
      79        2844 :     const typename base_type::value_type& v = *m_iterator;
      80        2844 :     if (v.pNode)
      81          60 :       return value_type(Node(*v, m_pMemory));
      82        2814 :     if (v.first && v.second)
      83        5628 :       return value_type(Node(*v.first, m_pMemory), Node(*v.second, m_pMemory));
      84           0 :     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

Generated by: LCOV version 1.14