| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 | //  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.//  This source code is licensed under both the GPLv2 (found in the//  COPYING file in the root directory) and Apache 2.0 License//  (found in the LICENSE.Apache file in the root directory).//#pragma once#include <algorithm>#include <array>#include <utility>#include "util/autovector.h"namespace ROCKSDB_NAMESPACE {// This is similar to std::unordered_map, except that it tries to avoid// allocating or deallocating memory as much as possible. With// std::unordered_map, an allocation/deallocation is made for every insertion// or deletion because of the requirement that iterators remain valid even// with insertions or deletions. This means that the hash chains will be// implemented as linked lists.//// This implementation uses autovector as hash chains insteads.//template <typename K, typename V, size_t size = 128>class HashMap {  std::array<autovector<std::pair<K, V>, 1>, size> table_; public:  bool Contains(K key) {    auto& bucket = table_[key % size];    auto it = std::find_if(        bucket.begin(), bucket.end(),        [key](const std::pair<K, V>& p) { return p.first == key; });    return it != bucket.end();  }  void Insert(K key, V value) {    auto& bucket = table_[key % size];    bucket.push_back({key, value});  }  void Delete(K key) {    auto& bucket = table_[key % size];    auto it = std::find_if(        bucket.begin(), bucket.end(),        [key](const std::pair<K, V>& p) { return p.first == key; });    if (it != bucket.end()) {      auto last = bucket.end() - 1;      if (it != last) {        *it = *last;      }      bucket.pop_back();    }  }  V& Get(K key) {    auto& bucket = table_[key % size];    auto it = std::find_if(        bucket.begin(), bucket.end(),        [key](const std::pair<K, V>& p) { return p.first == key; });    return it->second;  }};}  // namespace ROCKSDB_NAMESPACE
 |