123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- //
- // DefaultStrategy.h
- //
- // Library: Foundation
- // Package: Events
- // Module: DefaultStrategy
- //
- // Implementation of the DefaultStrategy template.
- //
- // Copyright (c) 2006-2011, Applied Informatics Software Engineering GmbH.
- // and Contributors.
- //
- // SPDX-License-Identifier: BSL-1.0
- //
- #ifndef Foundation_DefaultStrategy_INCLUDED
- #define Foundation_DefaultStrategy_INCLUDED
- #include "Poco/NotificationStrategy.h"
- #include "Poco/SharedPtr.h"
- #include <vector>
- namespace Poco {
- template <class TArgs, class TDelegate>
- class DefaultStrategy: public NotificationStrategy<TArgs, TDelegate>
- /// Default notification strategy.
- ///
- /// Internally, a std::vector<> is used to store
- /// delegate objects. Delegates are invoked in the
- /// order in which they have been registered.
- {
- public:
- typedef TDelegate* DelegateHandle;
- typedef SharedPtr<TDelegate> DelegatePtr;
- typedef std::vector<DelegatePtr> Delegates;
- typedef typename Delegates::iterator Iterator;
- public:
- DefaultStrategy()
- {
- }
- DefaultStrategy(const DefaultStrategy& s):
- _delegates(s._delegates)
- {
- }
- ~DefaultStrategy()
- {
- }
- void notify(const void* sender, TArgs& arguments)
- {
- for (Iterator it = _delegates.begin(); it != _delegates.end(); ++it)
- {
- (*it)->notify(sender, arguments);
- }
- }
- DelegateHandle add(const TDelegate& delegate)
- {
- DelegatePtr pDelegate(static_cast<TDelegate*>(delegate.clone()));
- _delegates.push_back(pDelegate);
- return pDelegate.get();
- }
- void remove(const TDelegate& delegate)
- {
- for (Iterator it = _delegates.begin(); it != _delegates.end(); ++it)
- {
- if (delegate.equals(**it))
- {
- (*it)->disable();
- _delegates.erase(it);
- return;
- }
- }
- }
-
- void remove(DelegateHandle delegateHandle)
- {
- for (Iterator it = _delegates.begin(); it != _delegates.end(); ++it)
- {
- if (*it == delegateHandle)
- {
- (*it)->disable();
- _delegates.erase(it);
- return;
- }
- }
- }
- DefaultStrategy& operator = (const DefaultStrategy& s)
- {
- if (this != &s)
- {
- _delegates = s._delegates;
- }
- return *this;
- }
- void clear()
- {
- for (Iterator it = _delegates.begin(); it != _delegates.end(); ++it)
- {
- (*it)->disable();
- }
- _delegates.clear();
- }
- bool empty() const
- {
- return _delegates.empty();
- }
- protected:
- Delegates _delegates;
- };
- template <class TDelegate>
- class DefaultStrategy<void,TDelegate>: public NotificationStrategy<void, TDelegate>
- /// Default notification strategy.
- ///
- /// Internally, a std::vector<> is used to store
- /// delegate objects. Delegates are invoked in the
- /// order in which they have been registered.
- {
- public:
- typedef TDelegate* DelegateHandle;
- typedef SharedPtr<TDelegate> DelegatePtr;
- typedef std::vector<DelegatePtr> Delegates;
- typedef typename Delegates::iterator Iterator;
- public:
- DefaultStrategy()
- {
- }
- DefaultStrategy(const DefaultStrategy& s):
- _delegates(s._delegates)
- {
- }
- ~DefaultStrategy()
- {
- }
- void notify(const void* sender)
- {
- for (Iterator it = _delegates.begin(); it != _delegates.end(); ++it)
- {
- (*it)->notify(sender);
- }
- }
- DelegateHandle add(const TDelegate& delegate)
- {
- DelegatePtr pDelegate(static_cast<TDelegate*>(delegate.clone()));
- _delegates.push_back(pDelegate);
- return pDelegate.get();
- }
- void remove(const TDelegate& delegate)
- {
- for (Iterator it = _delegates.begin(); it != _delegates.end(); ++it)
- {
- if (delegate.equals(**it))
- {
- (*it)->disable();
- _delegates.erase(it);
- return;
- }
- }
- }
- void remove(DelegateHandle delegateHandle)
- {
- for (Iterator it = _delegates.begin(); it != _delegates.end(); ++it)
- {
- if (*it == delegateHandle)
- {
- (*it)->disable();
- _delegates.erase(it);
- return;
- }
- }
- }
- DefaultStrategy& operator = (const DefaultStrategy& s)
- {
- if (this != &s)
- {
- _delegates = s._delegates;
- }
- return *this;
- }
- void clear()
- {
- for (Iterator it = _delegates.begin(); it != _delegates.end(); ++it)
- {
- (*it)->disable();
- }
- _delegates.clear();
- }
- bool empty() const
- {
- return _delegates.empty();
- }
- protected:
- Delegates _delegates;
- };
- } // namespace Poco
- #endif // Foundation_DefaultStrategy_INCLUDED
|