Kuzu C++ API
Loading...
Searching...
No Matches
mask.h
Go to the documentation of this file.
1#pragma once
2
3#include "types.h"
4
5namespace kuzu {
6namespace common {
7
8// Note that this class is NOT thread-safe.
9class SemiMask {
10public:
11 explicit SemiMask(offset_t maxOffset) : maxOffset{maxOffset}, enabled{false} {}
12
13 virtual ~SemiMask() = default;
14
15 virtual void mask(offset_t nodeOffset) = 0;
16 virtual void maskRange(offset_t startNodeOffset, offset_t endNodeOffset) = 0;
17
18 virtual bool isMasked(offset_t startNodeOffset) = 0;
19
20 // include&exclude
21 virtual offset_vec_t range(uint32_t start, uint32_t end) = 0;
22
23 virtual uint64_t getNumMaskedNodes() const = 0;
24
25 virtual offset_vec_t collectMaskedNodes(uint64_t size) const = 0;
26
27 offset_t getMaxOffset() const { return maxOffset; }
28
29 bool isEnabled() const { return enabled; }
30 void enable() { enabled = true; }
31
32private:
33 offset_t maxOffset;
34 bool enabled;
35};
36
38 KUZU_API static std::unique_ptr<SemiMask> createMask(offset_t maxOffset);
39};
40
42public:
43 NodeOffsetMaskMap() = default;
44
46
47 void addMask(table_id_t tableID, std::unique_ptr<SemiMask> mask) {
48 KU_ASSERT(!maskMap.contains(tableID));
49 maskMap.insert({tableID, std::move(mask)});
50 }
51
54 for (auto& [tableID, mask] : maskMap) {
55 result.emplace(tableID, mask.get());
56 }
57 return result;
58 }
59
60 bool containsTableID(table_id_t tableID) const { return maskMap.contains(tableID); }
62 KU_ASSERT(containsTableID(tableID));
63 return maskMap.at(tableID).get();
64 }
65
66 void pin(table_id_t tableID) {
67 if (maskMap.contains(tableID)) {
68 pinnedMask = maskMap.at(tableID).get();
69 } else {
70 pinnedMask = nullptr;
71 }
72 }
73 bool hasPinnedMask() const { return pinnedMask != nullptr; }
74 SemiMask* getPinnedMask() const { return pinnedMask; }
75
76 bool valid(offset_t offset) const {
77 KU_ASSERT(pinnedMask != nullptr);
78 return pinnedMask->isMasked(offset);
79 }
80 bool valid(nodeID_t nodeID) const {
81 KU_ASSERT(maskMap.contains(nodeID.tableID));
82 return maskMap.at(nodeID.tableID)->isMasked(nodeID.offset);
83 }
84
85private:
87 SemiMask* pinnedMask = nullptr;
88};
89
90} // namespace common
91} // namespace kuzu
#define KUZU_API
Definition api.h:25
#define KU_ASSERT(condition)
Definition assert.h:24
bool hasPinnedMask() const
Definition mask.h:73
void addMask(table_id_t tableID, std::unique_ptr< SemiMask > mask)
Definition mask.h:47
table_id_map_t< SemiMask * > getMasks() const
Definition mask.h:52
offset_t getNumMaskedNode() const
bool containsTableID(table_id_t tableID) const
Definition mask.h:60
SemiMask * getPinnedMask() const
Definition mask.h:74
bool valid(offset_t offset) const
Definition mask.h:76
void pin(table_id_t tableID)
Definition mask.h:66
bool valid(nodeID_t nodeID) const
Definition mask.h:80
SemiMask * getOffsetMask(table_id_t tableID) const
Definition mask.h:61
Definition mask.h:9
void enable()
Definition mask.h:30
virtual offset_vec_t collectMaskedNodes(uint64_t size) const =0
virtual void mask(offset_t nodeOffset)=0
virtual bool isMasked(offset_t startNodeOffset)=0
virtual offset_vec_t range(uint32_t start, uint32_t end)=0
bool isEnabled() const
Definition mask.h:29
virtual ~SemiMask()=default
offset_t getMaxOffset() const
Definition mask.h:27
virtual uint64_t getNumMaskedNodes() const =0
virtual void maskRange(offset_t startNodeOffset, offset_t endNodeOffset)=0
SemiMask(offset_t maxOffset)
Definition mask.h:11
Definition array_utils.h:7
std::unordered_map< table_id_t, T > table_id_map_t
Definition types.h:76
oid_t table_id_t
Definition types.h:72
internalID_t nodeID_t
Definition types.h:83
std::vector< offset_t > offset_vec_t
Definition types.h:88
uint64_t offset_t
Definition types.h:79
Definition array_utils.h:7
Definition mask.h:37
static KUZU_API std::unique_ptr< SemiMask > createMask(offset_t maxOffset)
offset_t offset
Definition types.h:91
table_id_t tableID
Definition types.h:92