graph_http/traits/
byte_range.rs1use async_trait::async_trait;
2use bytes::BytesMut;
3use std::collections::VecDeque;
4
5static RANGE_MULTIPLES: [usize; 32] = [
7 2, 4, 5, 8, 10, 16, 20, 32, 40, 64, 80, 128, 160, 256, 320, 512, 640, 1024, 1280, 2048, 2560,
8 4096, 5120, 8192, 10240, 16384, 20480, 32768, 40960, 65536, 81920, 163_840,
9];
10
11pub trait ByteRangeMultiple {
12 fn size(&self) -> u64;
13
14 fn byte_range_multiple(&self) -> u64 {
15 let size = self.size();
16 for (i, next) in RANGE_MULTIPLES.iter().rev().enumerate() {
17 let n = *next as u64;
18 let div = size / n;
19 let half = size / 2;
20
21 if div > 2 && div < half {
22 let num: u64 = size / n;
23 if num > 15 || i > 25 {
24 return n;
25 }
26 }
27 }
28 1
29 }
30}
31
32impl ByteRangeMultiple for BytesMut {
33 fn size(&self) -> u64 {
34 self.len() as u64
35 }
36}
37
38pub trait ByteRangeRead: ByteRangeMultiple {
39 fn read_to_vec(self) -> std::io::Result<VecDeque<(u64, u64, Vec<u8>)>>;
40 fn read_to_vec_range(
41 self,
42 start: u64,
43 end: u64,
44 ) -> std::io::Result<VecDeque<(u64, u64, Vec<u8>)>>;
45}
46
47#[async_trait]
48pub trait AsyncByteRangeRead: ByteRangeMultiple {
49 async fn read_to_vec(self) -> std::io::Result<VecDeque<(u64, u64, Vec<u8>)>>;
50 async fn read_to_vec_range(
51 self,
52 start: u64,
53 end: u64,
54 ) -> std::io::Result<VecDeque<(u64, u64, Vec<u8>)>>;
55}