LCOV - code coverage report
Current view: top level - src/esys/repo/progress - progresssession.cpp (source / functions) Hit Total Coverage
Test: esysrepo_coverage.info Lines: 35 39 89.7 %
Date: 2026-08-01 10:43:40 Functions: 8 9 88.9 %

          Line data    Source code
       1             : /*!
       2             :  * \file esys/repo/progress/progresssession.cpp
       3             :  * \brief
       4             :  *
       5             :  * \cond
       6             :  * __legal_b__
       7             :  *
       8             :  * Copyright (c) 2026 Michel Gillet
       9             :  * Distributed under the MIT License.
      10             :  * (See accompanying file LICENSE.txt or
      11             :  * copy at https://opensource.org/licenses/MIT)
      12             :  *
      13             :  * __legal_e__
      14             :  * \endcond
      15             :  *
      16             :  */
      17             : 
      18             : #include "esys/repo/esysrepo_prec.h"
      19             : #include "esys/repo/progress/progresssession.h"
      20             : 
      21             : #include <algorithm>
      22             : 
      23             : namespace esys::repo::progress
      24             : {
      25             : 
      26          40 : ProgressSession::ProgressSession() = default;
      27             : 
      28          40 : ProgressSession::~ProgressSession() = default;
      29             : 
      30          42 : void ProgressSession::add_observer(Observer *observer)
      31             : {
      32          42 :     if (observer == nullptr) return;
      33             : 
      34          41 :     std::lock_guard lock(m_mutex);
      35          41 :     auto it = std::find(m_observers.begin(), m_observers.end(), observer);
      36          41 :     if (it != m_observers.end()) return;
      37          40 :     m_observers.push_back(observer);
      38          42 : }
      39             : 
      40          35 : void ProgressSession::remove_observer(Observer *observer)
      41             : {
      42          35 :     if (observer == nullptr) return;
      43             : 
      44          35 :     std::lock_guard lock(m_mutex);
      45          35 :     auto it = std::find(m_observers.begin(), m_observers.end(), observer);
      46          35 :     if (it == m_observers.end()) return;
      47          35 :     m_observers.erase(it);
      48          35 : }
      49             : 
      50           1 : void ProgressSession::clear_observers()
      51             : {
      52           1 :     std::lock_guard lock(m_mutex);
      53           2 :     m_observers.clear();
      54           1 : }
      55             : 
      56           4 : std::size_t ProgressSession::get_observer_count() const
      57             : {
      58           4 :     std::lock_guard lock(m_mutex);
      59           4 :     return m_observers.size();
      60           4 : }
      61             : 
      62           0 : void ProgressSession::push(const SyncEvent &event)
      63             : {
      64           0 :     notify_observers(event);
      65           0 : }
      66             : 
      67        1866 : void ProgressSession::push(SyncEvent &&event)
      68             : {
      69        1866 :     notify_observers(event);
      70        1866 : }
      71             : 
      72        1866 : void ProgressSession::notify_observers(const SyncEvent &event)
      73             : {
      74        1866 :     std::vector<Observer *> snapshot;
      75        1866 :     {
      76        1866 :         std::lock_guard lock(m_mutex);
      77        1866 :         snapshot = m_observers;
      78           0 :     }
      79             : 
      80        3734 :     for (Observer *observer : snapshot)
      81             :     {
      82        1868 :         if (observer != nullptr) observer->on_sync_event(event);
      83             :     }
      84        1866 : }
      85             : 
      86             : } // namespace esys::repo::progress

Generated by: LCOV version 1.14