Skip to main content

nodedb_array/schema/
cell_order.rs

1// SPDX-License-Identifier: Apache-2.0
2
3//! Cell-order and tile-order strategies.
4
5use serde::{Deserialize, Serialize};
6
7/// Within-tile cell ordering strategy.
8///
9/// `Hilbert` is the default for ND locality — neighboring coordinates
10/// in any dim project to neighboring positions in the linear tile
11/// payload, which compresses well and preserves slice locality.
12#[derive(
13    Debug,
14    Clone,
15    Copy,
16    Default,
17    PartialEq,
18    Eq,
19    Serialize,
20    Deserialize,
21    zerompk::ToMessagePack,
22    zerompk::FromMessagePack,
23)]
24#[serde(rename_all = "snake_case")]
25#[msgpack(c_enum)]
26pub enum CellOrder {
27    RowMajor,
28    ColMajor,
29    #[default]
30    Hilbert,
31    ZOrder,
32}
33
34/// Across-tile ordering. Hilbert keeps tile-id sort order coherent
35/// with spatial locality, so range scans hit a contiguous run of tiles.
36#[derive(
37    Debug,
38    Clone,
39    Copy,
40    Default,
41    PartialEq,
42    Eq,
43    Serialize,
44    Deserialize,
45    zerompk::ToMessagePack,
46    zerompk::FromMessagePack,
47)]
48#[serde(rename_all = "snake_case")]
49#[msgpack(c_enum)]
50pub enum TileOrder {
51    RowMajor,
52    ColMajor,
53    #[default]
54    Hilbert,
55    ZOrder,
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61
62    #[test]
63    fn defaults_are_hilbert() {
64        assert_eq!(CellOrder::default(), CellOrder::Hilbert);
65        assert_eq!(TileOrder::default(), TileOrder::Hilbert);
66    }
67}