1 /** 2 * 3 * Copyright (c) 2005-2021 by Pierre-Henri WUILLEMIN(_at_LIP6) & Christophe GONZALES(_at_AMU) 4 * info_at_agrum_dot_org 5 * 6 * This library is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU Lesser General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public License 17 * along with this library. If not, see <http://www.gnu.org/licenses/>. 18 * 19 */ 20 21 22 /** 23 * @file 24 * @brief Class of signalers. 25 * 26 * @author Pierre-Henri WUILLEMIN(_at_LIP6) & Christophe GONZALES(_at_AMU) 27 * 28 */ 29 30 // To help IDE parsers 31 #include <agrum/tools/core/signal/signaler0.h> 32 33 namespace gum { 34 35 #ifndef DOXYGEN_SHOULD_SKIP_THIS 36 namespace __sig__ { 37 38 INLINE hasListener()39 bool BasicSignaler0::hasListener() { return (!(connectors_.empty())); } 40 41 INLINE detach(Listener * target)42 void BasicSignaler0::detach(Listener* target) { 43 auto it = std::find_if(connectors_.begin(), connectors_.end(), _find_target_(target)); 44 45 while (it != connectors_.end()) { 46 delete *it; 47 target->_detachSignal_(this); 48 49 it = connectors_.erase(it); // it is the next one 50 it = std::find_if(it, connectors_.end(), _find_target_(target)); 51 } 52 } 53 54 INLINE detachFromTarget_(Listener * target)55 void BasicSignaler0::detachFromTarget_(Listener* target) { 56 auto it = std::find_if(connectors_.begin(), connectors_.end(), _find_target_(target)); 57 58 while (it != connectors_.end()) { 59 delete *it; 60 61 it = connectors_.erase(it); // it is the next one 62 it = std::find_if(it, connectors_.end(), _find_target_(target)); 63 } 64 } 65 66 INLINE duplicateTarget_(const Listener * oldtarget,Listener * newtarget)67 void BasicSignaler0::duplicateTarget_(const Listener* oldtarget, Listener* newtarget) { 68 auto it = std::find_if(connectors_.begin(), connectors_.end(), _find_target_(oldtarget)); 69 70 while (it != connectors_.end()) { 71 connectors_.push_back((*it)->duplicate(newtarget)); 72 73 it++; 74 it = std::find_if(it, connectors_.end(), _find_target_(oldtarget)); 75 } 76 } 77 78 INLINE _find_target_(const gum::Listener * l)79 std::function< bool(IConnector0* el) > BasicSignaler0::_find_target_(const gum::Listener* l) { 80 return [=](IConnector0* el) -> bool { 81 return el->target() == l; 82 }; 83 } 84 85 } // namespace __sig__ 86 #endif 87 88 } // namespace gum 89