#ifndef ORDERED_HASH_MAP_INL_H_ #error "Direct inclusion of this file is not allowed, include ordered_hash_map.h" // For the sake of sane code completion. #include "ordered_hash_map.h" #endif #include namespace NYT { //////////////////////////////////////////////////////////////////////////////// template std::pair& TOrderedHashMap::TSelectPair::operator()(TItem& item) const { return item; } template const std::pair& TOrderedHashMap::TSelectPair::operator()(const TItem& item) const { return item; } //////////////////////////////////////////////////////////////////////////////// template TOrderedHashMap::TOrderedHashMap(const TOrderedHashMap& other) { *this = other; } template auto TOrderedHashMap::operator=(const TOrderedHashMap& other) -> TOrderedHashMap& { if (this == &other) { return *this; } clear(); Table_.reserve(other.size()); for (const auto& item : other) { emplace(item.first, item.second); } return *this; } template template auto TOrderedHashMap::emplace(TArgs&&... args) -> std::pair { auto [it, success] = Table_.emplace_unique(std::forward(args)...); if (success) { List_.PushBack(&*it); } return {MakeMappedIterator(TListIterator(&*it), TSelectPair{}), success}; } template template auto TOrderedHashMap::find(const TOtherKey& key) -> iterator { auto it = Table_.find(key); if (it == Table_.end()) { return MakeMappedIterator(List_.end(), TSelectPair{}); } return MakeMappedIterator(TListIterator(&*it), TSelectPair{}); } template template auto TOrderedHashMap::find(const TOtherKey& key) const -> const_iterator { auto it = Table_.find(key); if (it == Table_.end()) { return MakeMappedIterator(List_.end(), TSelectPair{}); } return MakeMappedIterator(TListConstIterator(&*it), TSelectPair{}); } template template bool TOrderedHashMap::contains(const TOtherKey& key) const { return Table_.find(key) != Table_.end(); } template template TValue& TOrderedHashMap::operator[](const TOtherKey& key) { typename TTable::insert_ctx ctx = nullptr; auto it = Table_.find_i(key, ctx); if (it != Table_.end()) { return it->second; } it = Table_.emplace_direct(ctx, std::piecewise_construct, std::forward_as_tuple(key), std::forward_as_tuple()); List_.PushBack(&*it); return it->second; } template template size_t TOrderedHashMap::erase(const TOtherKey& key) { return Table_.erase_one(key); } template void TOrderedHashMap::erase(iterator it) { erase(it->first); } template auto TOrderedHashMap::begin() -> iterator { return MakeMappedIterator(List_.begin(), TSelectPair{}); } template auto TOrderedHashMap::end() -> iterator { return MakeMappedIterator(List_.end(), TSelectPair{}); } template auto TOrderedHashMap::begin() const -> const_iterator { return MakeMappedIterator(List_.begin(), TSelectPair{}); } template auto TOrderedHashMap::end() const -> const_iterator { return MakeMappedIterator(List_.end(), TSelectPair{}); } template size_t TOrderedHashMap::size() const { return Table_.size(); } template void TOrderedHashMap::clear() { Table_.clear(); YT_ASSERT(List_.begin() == List_.end()); } //////////////////////////////////////////////////////////////////////////////// } // namespace NYT