diff options
author | orivej <orivej@yandex-team.ru> | 2022-02-10 16:44:49 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:44:49 +0300 |
commit | 718c552901d703c502ccbefdfc3c9028d608b947 (patch) | |
tree | 46534a98bbefcd7b1f3faa5b52c138ab27db75b7 /contrib/libs/poco/Foundation/include/Poco/UniqueExpireStrategy.h | |
parent | e9656aae26e0358d5378e5b63dcac5c8dbe0e4d0 (diff) | |
download | ydb-718c552901d703c502ccbefdfc3c9028d608b947.tar.gz |
Restoring authorship annotation for <orivej@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/libs/poco/Foundation/include/Poco/UniqueExpireStrategy.h')
-rw-r--r-- | contrib/libs/poco/Foundation/include/Poco/UniqueExpireStrategy.h | 276 |
1 files changed, 138 insertions, 138 deletions
diff --git a/contrib/libs/poco/Foundation/include/Poco/UniqueExpireStrategy.h b/contrib/libs/poco/Foundation/include/Poco/UniqueExpireStrategy.h index 6ae79945b1..b213caf543 100644 --- a/contrib/libs/poco/Foundation/include/Poco/UniqueExpireStrategy.h +++ b/contrib/libs/poco/Foundation/include/Poco/UniqueExpireStrategy.h @@ -1,138 +1,138 @@ -// -// UniqueExpireStrategy.h -// -// Library: Foundation -// Package: Cache -// Module: UniqueExpireStrategy -// -// Definition of the UniqueExpireStrategy class. -// -// Copyright (c) 2006, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#ifndef Foundation_UniqueExpireStrategy_INCLUDED -#define Foundation_UniqueExpireStrategy_INCLUDED - - -#include "Poco/KeyValueArgs.h" -#include "Poco/ValidArgs.h" -#include "Poco/AbstractStrategy.h" -#include "Poco/Bugcheck.h" -#include "Poco/Timestamp.h" -#include "Poco/EventArgs.h" -#include <set> -#include <map> - - -namespace Poco { - - -template < - class TKey, - class TValue -> -class UniqueExpireStrategy: public AbstractStrategy<TKey, TValue> - /// An UniqueExpireStrategy implements time based expiration of cache entries. In contrast - /// to ExpireStrategy which only allows to set a per cache expiration value, it allows to define - /// expiration per CacheEntry. - /// Each TValue object must thus offer the following method: - /// - /// const Poco::Timestamp& getExpiration() const; - /// - /// which returns the absolute timepoint when the entry will be invalidated. -{ -public: - typedef std::multimap<Timestamp, TKey> TimeIndex; - typedef typename TimeIndex::iterator IndexIterator; - typedef typename TimeIndex::const_iterator ConstIndexIterator; - typedef std::map<TKey, IndexIterator> Keys; - typedef typename Keys::iterator Iterator; - -public: - UniqueExpireStrategy() - /// Create an unique expire strategy. - { - } - - ~UniqueExpireStrategy() - { - } - - void onAdd(const void*, const KeyValueArgs <TKey, TValue>& args) - { - // note: we have to insert even if the expire timepoint is in the past (for StrategyCollection classes to avoid inconsistency with LRU) - // no problem: will be removed with next get - const Timestamp& expire = args.value().getExpiration(); - IndexIterator it = _keyIndex.insert(std::make_pair(expire, args.key())); - std::pair<Iterator, bool> stat = _keys.insert(std::make_pair(args.key(), it)); - if (!stat.second) - { - _keyIndex.erase(stat.first->second); - stat.first->second = it; - } - } - - void onRemove(const void*, const TKey& key) - { - Iterator it = _keys.find(key); - if (it != _keys.end()) - { - _keyIndex.erase(it->second); - _keys.erase(it); - } - } - - void onGet(const void*, const TKey& key) - { - // get triggers no changes in an expire - } - - void onClear(const void*, const EventArgs& args) - { - _keys.clear(); - _keyIndex.clear(); - } - - void onIsValid(const void*, ValidArgs<TKey>& args) - { - Iterator it = _keys.find(args.key()); - if (it != _keys.end()) - { - Timestamp now; - if (it->second->first <= now) - { - args.invalidate(); - } - } - else //not found: probably removed by onReplace - args.invalidate(); - } - - void onReplace(const void*, std::set<TKey>& elemsToRemove) - { - // Note: replace only informs the cache which elements - // it would like to remove! - // it does not remove them on its own! - IndexIterator it = _keyIndex.begin(); - Timestamp now; - while (it != _keyIndex.end() && it->first < now) - { - elemsToRemove.insert(it->second); - ++it; - } - } - -protected: - Keys _keys; /// For faster replacement of keys, the iterator points to the _keyIndex map - TimeIndex _keyIndex; /// Maps time to key value -}; - - -} // namespace Poco - - -#endif // Foundation_UniqueExpireStrategy_INCLUDED +// +// UniqueExpireStrategy.h +// +// Library: Foundation +// Package: Cache +// Module: UniqueExpireStrategy +// +// Definition of the UniqueExpireStrategy class. +// +// Copyright (c) 2006, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#ifndef Foundation_UniqueExpireStrategy_INCLUDED +#define Foundation_UniqueExpireStrategy_INCLUDED + + +#include "Poco/KeyValueArgs.h" +#include "Poco/ValidArgs.h" +#include "Poco/AbstractStrategy.h" +#include "Poco/Bugcheck.h" +#include "Poco/Timestamp.h" +#include "Poco/EventArgs.h" +#include <set> +#include <map> + + +namespace Poco { + + +template < + class TKey, + class TValue +> +class UniqueExpireStrategy: public AbstractStrategy<TKey, TValue> + /// An UniqueExpireStrategy implements time based expiration of cache entries. In contrast + /// to ExpireStrategy which only allows to set a per cache expiration value, it allows to define + /// expiration per CacheEntry. + /// Each TValue object must thus offer the following method: + /// + /// const Poco::Timestamp& getExpiration() const; + /// + /// which returns the absolute timepoint when the entry will be invalidated. +{ +public: + typedef std::multimap<Timestamp, TKey> TimeIndex; + typedef typename TimeIndex::iterator IndexIterator; + typedef typename TimeIndex::const_iterator ConstIndexIterator; + typedef std::map<TKey, IndexIterator> Keys; + typedef typename Keys::iterator Iterator; + +public: + UniqueExpireStrategy() + /// Create an unique expire strategy. + { + } + + ~UniqueExpireStrategy() + { + } + + void onAdd(const void*, const KeyValueArgs <TKey, TValue>& args) + { + // note: we have to insert even if the expire timepoint is in the past (for StrategyCollection classes to avoid inconsistency with LRU) + // no problem: will be removed with next get + const Timestamp& expire = args.value().getExpiration(); + IndexIterator it = _keyIndex.insert(std::make_pair(expire, args.key())); + std::pair<Iterator, bool> stat = _keys.insert(std::make_pair(args.key(), it)); + if (!stat.second) + { + _keyIndex.erase(stat.first->second); + stat.first->second = it; + } + } + + void onRemove(const void*, const TKey& key) + { + Iterator it = _keys.find(key); + if (it != _keys.end()) + { + _keyIndex.erase(it->second); + _keys.erase(it); + } + } + + void onGet(const void*, const TKey& key) + { + // get triggers no changes in an expire + } + + void onClear(const void*, const EventArgs& args) + { + _keys.clear(); + _keyIndex.clear(); + } + + void onIsValid(const void*, ValidArgs<TKey>& args) + { + Iterator it = _keys.find(args.key()); + if (it != _keys.end()) + { + Timestamp now; + if (it->second->first <= now) + { + args.invalidate(); + } + } + else //not found: probably removed by onReplace + args.invalidate(); + } + + void onReplace(const void*, std::set<TKey>& elemsToRemove) + { + // Note: replace only informs the cache which elements + // it would like to remove! + // it does not remove them on its own! + IndexIterator it = _keyIndex.begin(); + Timestamp now; + while (it != _keyIndex.end() && it->first < now) + { + elemsToRemove.insert(it->second); + ++it; + } + } + +protected: + Keys _keys; /// For faster replacement of keys, the iterator points to the _keyIndex map + TimeIndex _keyIndex; /// Maps time to key value +}; + + +} // namespace Poco + + +#endif // Foundation_UniqueExpireStrategy_INCLUDED |