Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-buffer/src/lib.rs
8353 views
1
pub mod buffer;
2
pub mod storage;
3
4
use std::ops;
5
6
pub use buffer::Buffer;
7
pub use storage::SharedStorage;
8
9
// Copied from the stdlib.
10
fn slice_index_fail(start: usize, end: usize, len: usize) -> ! {
11
if start > len {
12
panic!("range start index {start} out of range for slice of length {len}",)
13
}
14
15
if end > len {
16
panic!("range end index {end} out of range for slice of length {len}",)
17
}
18
19
if start > end {
20
panic!("slice index starts at {start} but ends at {end}",)
21
}
22
23
// Only reachable if the range was a `RangeInclusive` or a
24
// `RangeToInclusive`, with `end == len`.
25
panic!("range end index {end} out of range for slice of length {len}",)
26
}
27
28
#[must_use]
29
pub fn check_range<R>(range: R, bounds: ops::RangeTo<usize>) -> ops::Range<usize>
30
where
31
R: ops::RangeBounds<usize>,
32
{
33
let len = bounds.end;
34
let end = match range.end_bound() {
35
ops::Bound::Included(&end) if end >= len => slice_index_fail(0, end, len),
36
// Cannot overflow because `end < len` implies `end < usize::MAX`.
37
ops::Bound::Included(&end) => end + 1,
38
39
ops::Bound::Excluded(&end) if end > len => slice_index_fail(0, end, len),
40
ops::Bound::Excluded(&end) => end,
41
ops::Bound::Unbounded => len,
42
};
43
44
let start = match range.start_bound() {
45
ops::Bound::Excluded(&start) if start >= end => slice_index_fail(start, end, len),
46
// Cannot overflow because `start < end` implies `start < usize::MAX`.
47
ops::Bound::Excluded(&start) => start + 1,
48
49
ops::Bound::Included(&start) if start > end => slice_index_fail(start, end, len),
50
ops::Bound::Included(&start) => start,
51
52
ops::Bound::Unbounded => 0,
53
};
54
55
ops::Range { start, end }
56
}
57
58
#[must_use]
59
pub fn decode_range_unchecked<R>(range: R, bounds: ops::RangeTo<usize>) -> ops::Range<usize>
60
where
61
R: ops::RangeBounds<usize>,
62
{
63
let len = bounds.end;
64
let end = match range.end_bound() {
65
ops::Bound::Included(&end) => end + 1,
66
ops::Bound::Excluded(&end) => end,
67
ops::Bound::Unbounded => len,
68
};
69
70
let start = match range.start_bound() {
71
ops::Bound::Excluded(&start) => start + 1,
72
ops::Bound::Included(&start) => start,
73
ops::Bound::Unbounded => 0,
74
};
75
76
ops::Range { start, end }
77
}
78
79