diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/poco/Foundation/include/Poco/HashMap.h | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/poco/Foundation/include/Poco/HashMap.h')
-rw-r--r-- | contrib/libs/poco/Foundation/include/Poco/HashMap.h | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/contrib/libs/poco/Foundation/include/Poco/HashMap.h b/contrib/libs/poco/Foundation/include/Poco/HashMap.h new file mode 100644 index 0000000000..5153f2b164 --- /dev/null +++ b/contrib/libs/poco/Foundation/include/Poco/HashMap.h @@ -0,0 +1,228 @@ +// +// HashMap.h +// +// Library: Foundation +// Package: Hashing +// Module: HashMap +// +// Definition of the HashMap class. +// +// Copyright (c) 2006, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#ifndef Foundation_HashMap_INCLUDED +#define Foundation_HashMap_INCLUDED + + +#include "Poco/Foundation.h" +#include "Poco/LinearHashTable.h" +#include "Poco/Exception.h" +#include <utility> + + +namespace Poco { + + +template <class Key, class Value> +struct HashMapEntry + /// This class template is used internally by HashMap. +{ + Key first; + Value second; + + HashMapEntry(): + first(), + second() + { + } + + HashMapEntry(const Key& key): + first(key), + second() + { + } + + HashMapEntry(const Key& key, const Value& value): + first(key), + second(value) + { + } + + bool operator == (const HashMapEntry& entry) const + { + return first == entry.first; + } + + bool operator != (const HashMapEntry& entry) const + { + return first != entry.first; + } +}; + + +template <class HME, class KeyHashFunc> +struct HashMapEntryHash + /// This class template is used internally by HashMap. +{ + std::size_t operator () (const HME& entry) const + { + return _func(entry.first); + } + +private: + KeyHashFunc _func; +}; + + +template <class Key, class Mapped, class HashFunc = Hash<Key> > +class HashMap + /// This class implements a map using a LinearHashTable. + /// + /// A HashMap can be used just like a std::map. +{ +public: + typedef Key KeyType; + typedef Mapped MappedType; + typedef Mapped& Reference; + typedef const Mapped& ConstReference; + typedef Mapped* Pointer; + typedef const Mapped* ConstPointer; + + typedef HashMapEntry<Key, Mapped> ValueType; + typedef std::pair<KeyType, MappedType> PairType; + + typedef HashMapEntryHash<ValueType, HashFunc> HashType; + typedef LinearHashTable<ValueType, HashType> HashTable; + + typedef typename HashTable::Iterator Iterator; + typedef typename HashTable::ConstIterator ConstIterator; + + HashMap() + /// Creates an empty HashMap. + { + } + + HashMap(std::size_t initialReserve): + _table(initialReserve) + /// Creates the HashMap with room for initialReserve entries. + { + } + + HashMap& operator = (const HashMap& map) + /// Assigns another HashMap. + { + HashMap tmp(map); + swap(tmp); + return *this; + } + + void swap(HashMap& map) + /// Swaps the HashMap with another one. + { + _table.swap(map._table); + } + + ConstIterator begin() const + { + return _table.begin(); + } + + ConstIterator end() const + { + return _table.end(); + } + + Iterator begin() + { + return _table.begin(); + } + + Iterator end() + { + return _table.end(); + } + + ConstIterator find(const KeyType& key) const + { + ValueType value(key); + return _table.find(value); + } + + Iterator find(const KeyType& key) + { + ValueType value(key); + return _table.find(value); + } + + std::size_t count(const KeyType& key) const + { + ValueType value(key); + return _table.find(value) != _table.end() ? 1 : 0; + } + + std::pair<Iterator, bool> insert(const PairType& pair) + { + ValueType value(pair.first, pair.second); + return _table.insert(value); + } + + std::pair<Iterator, bool> insert(const ValueType& value) + { + return _table.insert(value); + } + + void erase(Iterator it) + { + _table.erase(it); + } + + void erase(const KeyType& key) + { + Iterator it = find(key); + _table.erase(it); + } + + void clear() + { + _table.clear(); + } + + std::size_t size() const + { + return _table.size(); + } + + bool empty() const + { + return _table.empty(); + } + + ConstReference operator [] (const KeyType& key) const + { + ConstIterator it = _table.find(key); + if (it != _table.end()) + return it->second; + else + throw NotFoundException(); + } + + Reference operator [] (const KeyType& key) + { + ValueType value(key); + std::pair<Iterator, bool> res = _table.insert(value); + return res.first->second; + } + +private: + HashTable _table; +}; + + +} // namespace Poco + + +#endif // Foundation_HashMap_INCLUDED |