Coverage Report

Created: 2024-09-19 18:47

/root/bitcoin/src/leveldb/db/memtable.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file. See the AUTHORS file for names of contributors.
4
5
#ifndef STORAGE_LEVELDB_DB_MEMTABLE_H_
6
#define STORAGE_LEVELDB_DB_MEMTABLE_H_
7
8
#include <string>
9
10
#include "db/dbformat.h"
11
#include "db/skiplist.h"
12
#include "leveldb/db.h"
13
#include "util/arena.h"
14
15
namespace leveldb {
16
17
class InternalKeyComparator;
18
class MemTableIterator;
19
20
class MemTable {
21
 public:
22
  // MemTables are reference counted.  The initial reference count
23
  // is zero and the caller must call Ref() at least once.
24
  explicit MemTable(const InternalKeyComparator& comparator);
25
26
  MemTable(const MemTable&) = delete;
27
  MemTable& operator=(const MemTable&) = delete;
28
29
  // Increase reference count.
30
0
  void Ref() { ++refs_; }
31
32
  // Drop reference count.  Delete if no more references exist.
33
2
  void Unref() {
34
2
    --refs_;
35
2
    assert(refs_ >= 0);
36
2
    if (refs_ <= 0) {
37
2
      delete this;
38
2
    }
39
2
  }
40
41
  // Returns an estimate of the number of bytes of data in use by this
42
  // data structure. It is safe to call when MemTable is being modified.
43
  size_t ApproximateMemoryUsage();
44
45
  // Return an iterator that yields the contents of the memtable.
46
  //
47
  // The caller must ensure that the underlying MemTable remains live
48
  // while the returned iterator is live.  The keys returned by this
49
  // iterator are internal keys encoded by AppendInternalKey in the
50
  // db/format.{h,cc} module.
51
  Iterator* NewIterator();
52
53
  // Add an entry into memtable that maps key to value at the
54
  // specified sequence number and with the specified type.
55
  // Typically value will be empty if type==kTypeDeletion.
56
  void Add(SequenceNumber seq, ValueType type, const Slice& key,
57
           const Slice& value);
58
59
  // If memtable contains a value for key, store it in *value and return true.
60
  // If memtable contains a deletion for key, store a NotFound() error
61
  // in *status and return true.
62
  // Else, return false.
63
  bool Get(const LookupKey& key, std::string* value, Status* s);
64
65
 private:
66
  friend class MemTableIterator;
67
  friend class MemTableBackwardIterator;
68
69
  struct KeyComparator {
70
    const InternalKeyComparator comparator;
71
0
    explicit KeyComparator(const InternalKeyComparator& c) : comparator(c) {}
72
    int operator()(const char* a, const char* b) const;
73
  };
74
75
  typedef SkipList<const char*, KeyComparator> Table;
76
77
  ~MemTable();  // Private since only Unref() should be used to delete it
78
79
  KeyComparator comparator_;
80
  int refs_;
81
  Arena arena_;
82
  Table table_;
83
};
84
85
}  // namespace leveldb
86
87
#endif  // STORAGE_LEVELDB_DB_MEMTABLE_H_