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 51 : ProgressSession::ProgressSession() = default; 27 : 28 51 : ProgressSession::~ProgressSession() = default; 29 : 30 53 : void ProgressSession::add_observer(Observer *observer) 31 : { 32 53 : if (observer == nullptr) return; 33 : 34 52 : std::lock_guard lock(m_mutex); 35 52 : auto it = std::find(m_observers.begin(), m_observers.end(), observer); 36 52 : if (it != m_observers.end()) return; 37 51 : m_observers.push_back(observer); 38 53 : } 39 : 40 46 : void ProgressSession::remove_observer(Observer *observer) 41 : { 42 46 : if (observer == nullptr) return; 43 : 44 46 : std::lock_guard lock(m_mutex); 45 46 : auto it = std::find(m_observers.begin(), m_observers.end(), observer); 46 46 : if (it == m_observers.end()) return; 47 46 : m_observers.erase(it); 48 46 : } 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 2633 : void ProgressSession::push(SyncEvent &&event) 68 : { 69 2633 : notify_observers(event); 70 2633 : } 71 : 72 2633 : void ProgressSession::notify_observers(const SyncEvent &event) 73 : { 74 2633 : std::vector<Observer *> snapshot; 75 2633 : { 76 2633 : std::lock_guard lock(m_mutex); 77 2633 : snapshot = m_observers; 78 0 : } 79 : 80 5268 : for (Observer *observer : snapshot) 81 : { 82 2635 : if (observer != nullptr) observer->on_sync_event(event); 83 : } 84 2633 : } 85 : 86 : } // namespace esys::repo::progress