1 // 2 // StrategyCollection.h 3 // 4 // Library: Foundation 5 // Package: Cache 6 // Module: StrategyCollection 7 // 8 // Definition of the StrategyCollection class. 9 // 10 // Copyright (c) 2006, Applied Informatics Software Engineering GmbH. 11 // and Contributors. 12 // 13 // SPDX-License-Identifier: BSL-1.0 14 // 15 16 17 #ifndef Foundation_StrategyCollection_INCLUDED 18 #define Foundation_StrategyCollection_INCLUDED 19 20 21 #include "Poco/KeyValueArgs.h" 22 #include "Poco/ValidArgs.h" 23 #include "Poco/AbstractStrategy.h" 24 #include "Poco/SharedPtr.h" 25 #include <vector> 26 27 28 namespace Poco { 29 30 31 template <class TKey, class TValue> 32 class StrategyCollection: public AbstractStrategy<TKey, TValue> 33 /// An StrategyCollection is a decorator masking n collections as a single one. 34 { 35 public: 36 using Strategies = std::vector<SharedPtr<AbstractStrategy<TKey, TValue>>>; 37 using Iterator = typename Strategies::iterator; 38 using ConstIterator = typename Strategies::const_iterator; 39 40 public: StrategyCollection()41 StrategyCollection() 42 { 43 } 44 ~StrategyCollection()45 ~StrategyCollection() 46 { 47 } 48 pushBack(AbstractStrategy<TKey,TValue> * pStrat)49 void pushBack(AbstractStrategy<TKey, TValue>* pStrat) 50 /// Adds an AbstractStrategy to the collection. Class takes ownership of pointer 51 { 52 _strategies.push_back(SharedPtr<AbstractStrategy<TKey, TValue>>(pStrat)); 53 } 54 popBack()55 void popBack() 56 /// Removes the last added AbstractStrategy from the collection. 57 { 58 _strategies.pop_back(); 59 } 60 onAdd(const void * pSender,const KeyValueArgs<TKey,TValue> & key)61 void onAdd(const void* pSender, const KeyValueArgs <TKey, TValue>& key) 62 /// Adds the key to the strategy. 63 /// If for the key already an entry exists, it will be overwritten. 64 { 65 Iterator it = _strategies.begin(); 66 Iterator endIt = _strategies.end(); 67 for (; it != endIt; ++it) 68 { 69 (*it)->onAdd(pSender, key); 70 } 71 } 72 onRemove(const void * pSender,const TKey & key)73 void onRemove(const void* pSender, const TKey& key) 74 /// Removes an entry from the strategy. If the entry is not found 75 /// the remove is ignored. 76 { 77 Iterator it = _strategies.begin(); 78 Iterator endIt = _strategies.end(); 79 for (; it != endIt; ++it) 80 { 81 (*it)->onRemove(pSender, key); 82 } 83 } 84 onGet(const void * pSender,const TKey & key)85 void onGet(const void* pSender, const TKey& key) 86 { 87 Iterator it = _strategies.begin(); 88 Iterator endIt = _strategies.end(); 89 for (; it != endIt; ++it) 90 { 91 (*it)->onGet(pSender, key); 92 } 93 } 94 onClear(const void * pSender,const EventArgs & args)95 void onClear(const void* pSender, const EventArgs& args) 96 { 97 Iterator it = _strategies.begin(); 98 Iterator endIt = _strategies.end(); 99 for (; it != endIt; ++it) 100 { 101 (*it)->onClear(pSender, args); 102 } 103 } 104 onIsValid(const void * pSender,ValidArgs<TKey> & key)105 void onIsValid(const void* pSender, ValidArgs<TKey>& key) 106 { 107 Iterator it = _strategies.begin(); 108 Iterator endIt = _strategies.end(); 109 for (; it != endIt && key.isValid(); ++it) 110 { 111 (*it)->onIsValid(pSender, key); 112 } 113 } 114 onReplace(const void * pSender,std::set<TKey> & elemsToRemove)115 void onReplace(const void* pSender, std::set<TKey>& elemsToRemove) 116 { 117 Iterator it = _strategies.begin(); 118 Iterator endIt = _strategies.end(); 119 for (; it != endIt; ++it) 120 { 121 (*it)->onReplace(pSender, elemsToRemove); 122 } 123 } 124 125 protected: 126 Strategies _strategies; 127 }; 128 129 130 } // namespace Poco 131 132 133 #endif // Foundation_StrategyCollection_INCLUDED 134