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