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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
use ;
use crateBStack;
use io;
/// A singleton allocator that carries no underlying [`BStack`] and never
/// allocates.
///
/// `ManualAllocator` is for code that wants the [`BStackSlice`] type — a
/// typed `(offset, len)` handle with the standard slice interface — but
/// manages positions on the backing [`BStack`] directly, without delegating
/// region tracking to an allocator.
///
/// # Behaviour
///
/// | Operation | Behaviour |
/// |---------------------------------------------------|------------------------------|
/// | [`alloc`](BStackAllocator::alloc) | Returns `Err(Unsupported)` |
/// | [`realloc`](BStackAllocator::realloc) | Returns `Err(Unsupported)` |
/// | [`dealloc`](BStackAllocator::dealloc) | Returns `Ok(())` (no-op) |
/// | [`len`](BStackAllocator::len) | Returns `Err(Unsupported)` |
/// | [`is_empty`](BStackAllocator::is_empty) | Returns `Err(Unsupported)` |
/// | [`stack`](BStackAllocator::stack) | **Panics** — no backing stack |
/// | [`into_stack`](BStackAllocator::into_stack) | **Panics** — no backing stack |
///
/// # Singleton
///
/// Obtain the allocator via [`ManualAllocator::get`], which always returns the
/// same `&'static ManualAllocator`. Direct construction is intentionally
/// prevented to make the singleton nature explicit and to discourage treating
/// the type as a regular value.
///
/// # Creating slices
///
/// Use [`BStackSlice::from_raw_parts`] to create a slice at a known position:
///
/// ```rust,ignore
/// let slice = unsafe { BStackSlice::from_raw_parts(ManualAllocator::get(), offset, len) };
/// ```
///
/// Or reconstruct one from a serialised token:
///
/// ```rust,ignore
/// let slice = unsafe { BStackSlice::from_bytes(ManualAllocator::get(), token) };
/// ```
///
/// Because there is no backing [`BStack`], calling [`BStackSlice::read`] or
/// [`BStackSlice::write`] on such a slice will **panic**. The slice is useful
/// as a typed coordinate — serialised, compared, sorted, stored alongside
/// other data — while all I/O is performed directly on the [`BStack`] via
/// [`BStack::get`] / [`BStack::set`] at the offsets the slice describes.
///
/// # Manual position management
///
/// Since no allocator tracks ownership, the caller is entirely responsible for
/// ensuring that every `(offset, len)` pair describes a valid, live region
/// within the backing [`BStack`], that regions do not overlap unless
/// intentional, and that the [`BStack`] is not truncated beneath a live slice.
/// No bookkeeping or validation is performed on construction.
);
static INSTANCE: ManualAllocator = ManualAllocator;