aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/poco/Foundation/include/Poco/StrategyCollection.h
blob: 6372d4662090c4793acc2312631869a78bbb5365 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//
// StrategyCollection.h
//
// Library: Foundation
// Package: Cache
// Module:  StrategyCollection
//
// Definition of the StrategyCollection class.
//
// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier:	BSL-1.0
//


#ifndef Foundation_StrategyCollection_INCLUDED
#define Foundation_StrategyCollection_INCLUDED


#include "Poco/KeyValueArgs.h"
#include "Poco/ValidArgs.h"
#include "Poco/AbstractStrategy.h"
#include "Poco/SharedPtr.h"
#include <vector>


namespace Poco {


template <class TKey, class TValue> 
class StrategyCollection: public AbstractStrategy<TKey, TValue>
	/// An StrategyCollection is a decorator masking n collections as a single one.
{
public:
	typedef std::vector<SharedPtr<AbstractStrategy<TKey, TValue> > > Strategies;
	typedef typename Strategies::iterator       Iterator;
	typedef typename Strategies::const_iterator ConstIterator;

public:
	StrategyCollection()
	{
	}

	~StrategyCollection()
	{
	}

	void pushBack(AbstractStrategy<TKey, TValue>* pStrat)
		/// Adds an AbstractStrategy to the collection. Class takes ownership of pointer
	{
		_strategies.push_back(SharedPtr<AbstractStrategy<TKey, TValue> >(pStrat));
	}

	void popBack()
		/// Removes the last added AbstractStrategy from the collection.
	{
		_strategies.pop_back();
	}

	void onAdd(const void* pSender, const KeyValueArgs <TKey, TValue>& key)
		/// Adds the key to the strategy.
		/// If for the key already an entry exists, it will be overwritten.
	{
		Iterator it = _strategies.begin();
		Iterator endIt = _strategies.end();
		for (; it != endIt; ++it)
		{
			(*it)->onAdd(pSender, key);
		}
	}

	void onRemove(const void* pSender, const TKey& key)
		/// Removes an entry from the strategy. If the entry is not found
		/// the remove is ignored.
	{
		Iterator it = _strategies.begin();
		Iterator endIt = _strategies.end();
		for (; it != endIt; ++it)
		{
			(*it)->onRemove(pSender, key);
		}
	}

	void onGet(const void* pSender, const TKey& key)
	{
		Iterator it = _strategies.begin();
		Iterator endIt = _strategies.end();
		for (; it != endIt; ++it)
		{
			(*it)->onGet(pSender, key);
		}
	}

	void onClear(const void* pSender, const EventArgs& args)
	{
		Iterator it = _strategies.begin();
		Iterator endIt = _strategies.end();
		for (; it != endIt; ++it)
		{
			(*it)->onClear(pSender, args);
		}
	}

	void onIsValid(const void* pSender, ValidArgs<TKey>& key)
	{
		Iterator it = _strategies.begin();
		Iterator endIt = _strategies.end();
		for (; it != endIt && key.isValid(); ++it)
		{
			(*it)->onIsValid(pSender, key);
		}
	}

	void onReplace(const void* pSender, std::set<TKey>& elemsToRemove)
	{
		Iterator it = _strategies.begin();
		Iterator endIt = _strategies.end();
		for (; it != endIt; ++it)
		{
			(*it)->onReplace(pSender, elemsToRemove);
		}
	}

protected:
	Strategies _strategies;
};


} // namespace Poco


#endif // Foundation_StrategyCollection_INCLUDED