aboutsummaryrefslogtreecommitdiff
path: root/shared/afs/btree/node.zig
blob: fbd0b495df5e22c30bafbe2421caaebdf27929e3 (plain)
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
//! AFS B-tree Node Operations

pub fn getNodeCell(node_number: u32, cell_size: u32, node_size: u32) u64 {
    const nodes_per_cell = cell_size / node_size;
    return node_number / nodes_per_cell;
}

pub fn getNodeOffsetInCell(node_number: u32, cell_size: u32, node_size: u32) u32 {
    const nodes_per_cell = cell_size / node_size;
    return (node_number % nodes_per_cell) * node_size;
}

pub fn getRecordOffset(node_buffer: [*]const u8, node_size: u32, record_index: u16) u16 {
    const offset_table_start = node_size - (@as(u32, record_index) + 1) * @sizeOf(u16);
    const offset_pointer: *align(1) const u16 = @ptrCast(node_buffer + offset_table_start);
    return offset_pointer.*;
}

pub fn getRecordPointer(node_buffer: [*]u8, node_size: u32, record_index: u16) [*]u8 {
    const offset = getRecordOffset(node_buffer, node_size, record_index);
    return node_buffer + offset;
}

pub fn getRecordPointerConst(node_buffer: [*]const u8, node_size: u32, record_index: u16) [*]const u8 {
    const offset = getRecordOffset(node_buffer, node_size, record_index);
    return node_buffer + offset;
}