#pragma once #include #include #include namespace NYT { //////////////////////////////////////////////////////////////////////////////// //! A hash map where the iteration order is the insertion order. template < class TKey, class TValue, class THashFunction = THash, class TEqualFunction = TEqualTo > class TOrderedHashMap { private: struct TItem : public std::pair , public TIntrusiveListItem { using std::pair::pair; }; struct TSelectPair { std::pair& operator()(TItem& item) const; const std::pair& operator()(const TItem& item) const; }; using TList = TIntrusiveList; using TListIterator = TList::iterator; using TListConstIterator = TList::const_iterator; public: using iterator = TMappedIterator; using const_iterator = TMappedIterator; public: TOrderedHashMap() = default; TOrderedHashMap(const TOrderedHashMap& other); TOrderedHashMap(TOrderedHashMap&& other) = default; TOrderedHashMap& operator=(const TOrderedHashMap& other); TOrderedHashMap& operator=(TOrderedHashMap&& other) = default; template std::pair emplace(TArgs&&... args); template iterator find(const TOtherKey& key); template const_iterator find(const TOtherKey& key) const; template bool contains(const TOtherKey& key) const; template TValue& operator[](const TOtherKey& key); template size_t erase(const TOtherKey& key); void erase(iterator it); iterator begin(); iterator end(); const_iterator begin() const; const_iterator end() const; size_t size() const; void clear(); private: using TTable = THashTable>; private: TList List_; TTable Table_; }; //////////////////////////////////////////////////////////////////////////////// } // namespace NYT #define ORDERED_HASH_MAP_INL_H_ #include "ordered_hash_map-inl.h" #undef ORDERED_HASH_MAP_INL_H_