File: hash_map.h

package info (click to toggle)
rocksdb 9.10.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 46,052 kB
  • sloc: cpp: 500,768; java: 42,992; ansic: 9,789; python: 8,373; perl: 5,822; sh: 4,921; makefile: 2,386; asm: 550; xml: 342
file content (67 lines) | stat: -rw-r--r-- 1,963 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//  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, const 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