Pixie
Loading...
Searching...
No Matches
louds.h
1#pragma once
2
3#include <pixie/rank_select/support.h>
4#include <pixie/tree.h>
5
6#include <cstdint>
7#include <span>
8
9namespace pixie {
10
14using LoudsNode = TreeNode;
15
20class LoudsTree : public TreeBase<LoudsTree> {
21 private:
23
24 public:
28 explicit LoudsTree(std::span<const uint64_t> louds, size_t tree_size)
29 : bv(louds, 2 * tree_size - 1) {}
30
34 LoudsNode root_impl() const { return LoudsNode(0, 0); }
35
39 size_t size_impl() const { return (bv.size() + 1) / 2; }
40
44 bool is_leaf_impl(const LoudsNode& node) const {
45 return (node.pos + 1 == bv.size()) or bv[node.pos + 1];
46 }
47
51 bool is_root_impl(const LoudsNode& node) const { return node.number == 0; }
52
56 size_t degree_impl(const LoudsNode& node) const {
57 if (is_leaf_impl(node)) {
58 return 0;
59 }
60 return bv.select(node.number + 2) - node.pos - 1;
61 }
62
67 LoudsNode child_impl(const LoudsNode& node, size_t i) const {
68 size_t zeros = node.pos + i + 1 - node.number;
69 return LoudsNode(zeros, bv.select(zeros + 1));
70 }
71
75 LoudsNode first_child_impl(const LoudsNode& node) const {
76 size_t zeros = node.pos + 1 - node.number;
77 return LoudsNode(zeros, bv.select(zeros + 1));
78 }
79
84 LoudsNode parent_impl(const LoudsNode& node) const {
85 if (node.number == 0) {
86 return root_impl();
87 }
88 size_t zero_pos = bv.select0(node.number);
89 size_t parent_number = zero_pos - node.number;
90 return LoudsNode(parent_number, bv.select(parent_number + 1));
91 }
92
96 bool is_last_child_impl(const LoudsNode& node) const {
97 size_t zero_pos = bv.select0(node.number);
98 return bv[zero_pos + 1];
99 }
100
104 LoudsNode next_sibling_impl(const LoudsNode& node) const {
105 size_t sibling_number = node.number + 1;
106 return LoudsNode(sibling_number, bv.select(sibling_number + 1));
107 }
108};
109
110} // namespace pixie
LoudsNode parent_impl(const LoudsNode &node) const
Returns the parent of a node if node is not root, else returns root.
Definition louds.h:84
size_t degree_impl(const LoudsNode &node) const
Returns the number of children of a node.
Definition louds.h:56
LoudsTree(std::span< const uint64_t > louds, size_t tree_size)
Constructor from an external array of uint64_t.
Definition louds.h:28
bool is_root_impl(const LoudsNode &node) const
Indicates if node is a root.
Definition louds.h:51
bool is_leaf_impl(const LoudsNode &node) const
Indicates if node is a leaf.
Definition louds.h:44
LoudsNode child_impl(const LoudsNode &node, size_t i) const
Returns the i-th child of node Indexing starts at 0.
Definition louds.h:67
LoudsNode root_impl() const
Returns the root node.
Definition louds.h:34
LoudsNode next_sibling_impl(const LoudsNode &node) const
Returns next sibling of a node.
Definition louds.h:104
size_t size_impl() const
Returns the size of the tree.
Definition louds.h:39
bool is_last_child_impl(const LoudsNode &node) const
Indicates if node is last child.
Definition louds.h:96
LoudsNode first_child_impl(const LoudsNode &node) const
Returns first child of a node.
Definition louds.h:75
Rank/select support over an external packed bit sequence.
Definition support.h:55
CRTP facade for rooted ordered trees.
Definition tree.h:43
Logical node handle shared by succinct rooted-tree encodings.
Definition tree.h:18
std::size_t number
Logical node number in the encoding's traversal order.
Definition tree.h:20
std::size_t pos
Bit position representing the node in the succinct encoding.
Definition tree.h:23
Common interface and node handle for rooted ordered trees.