-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmemtable.py
More file actions
32 lines (25 loc) · 883 Bytes
/
Copy pathmemtable.py
File metadata and controls
32 lines (25 loc) · 883 Bytes
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
from typing import Iterator, Optional, Tuple
from common import TOMBSTONE, Value
from rbtree import RBTree, inorder_traversal
class Memtable:
def __init__(self):
self.bytes = 0
self.tree = RBTree()
def set(self, k: str, v: str) -> None:
self.bytes += len(k) + len(v)
self.tree.insert(k, v)
def get(self, k: str) -> Optional[Value]:
return self.tree.search(k)
def unset(self, k: str) -> None:
value = self.get(k)
if value is TOMBSTONE:
return
if value is not None:
self.bytes -= len(value) #type: ignore [arg-type]
else:
self.bytes += len(k)
self.tree.insert(k, TOMBSTONE)
def entries(self) -> Iterator[Tuple[str, str]]:
yield from inorder_traversal(self.tree.root)
def approximate_bytes(self) -> int:
return self.bytes