Git fork

feat: convert basics.rs

thecoded.prof 2cdb7a38 48861d4b

verified
+59 -52
+52 -45
src/reftable/basics.rs
··· 1 - #[derive(Debug, Clone)] 2 - pub struct ReftableBuf { 3 - pub data: Vec<u8>, 4 - pub len: usize, 5 - } 1 + use crate::reftable::{ 2 + error::ReftableError, 3 + record::{REFTABLE_HASH_SIZE_SHA1, REFTABLE_HASH_SIZE_SHA256}, 4 + reftable_basics::ReftableBuf, 5 + }; 6 + 7 + pub fn binsearch<F, T>(sz: usize, mut f: F, args: &T) -> usize 8 + where 9 + F: FnMut(usize, &T) -> Result<isize, String>, 10 + { 11 + let mut lo = 0usize; 12 + let mut hi = sz; 13 + 14 + while hi - lo > 1 { 15 + let mid = lo + (hi - lo) / 2; 16 + let ret = f(mid, args).unwrap(); 6 17 7 - impl ReftableBuf { 8 - pub fn new() -> Self { 9 - Self { 10 - data: Vec::new(), 11 - len: 0, 18 + if ret < 0 { 19 + return sz; 12 20 } 13 - } 14 21 15 - pub fn with_capacity(capacity: usize) -> Self { 16 - Self { 17 - data: Vec::with_capacity(capacity), 18 - len: 0, 22 + if ret > 0 { 23 + hi = mid; 24 + } else { 25 + lo = mid; 19 26 } 20 27 } 21 28 22 - pub fn clear(&mut self) { 23 - self.data.clear(); 24 - self.len = 0; 29 + if lo != 0 { 30 + return hi; 25 31 } 26 32 27 - pub fn as_slice(&self) -> &[u8] { 28 - &self.data[..self.len] 29 - } 33 + return if f(0, args).unwrap() == 1 { 1 } else { 0 }; 30 34 } 31 35 32 - impl Default for ReftableBuf { 33 - fn default() -> Self { 34 - Self::new() 35 - } 36 + pub fn names_length(names: &[&str]) -> usize { 37 + names.len() 36 38 } 37 39 38 - pub fn binsearch<F>(sz: usize, mut f: F) -> usize 39 - where 40 - F: FnMut(usize) -> Result<bool, String>, 41 - { 42 - todo!() 43 - } 44 - 45 - pub fn names_length(names: &[&str]) -> usize { 46 - todo!() 40 + pub fn parse_names(buf: &str) -> Result<Vec<String>, ReftableError> { 41 + if !buf.ends_with('\n') { 42 + return Err(ReftableError::Format); 43 + } 44 + let mut names = buf 45 + .split('\n') 46 + .map(|name| name.trim().to_string()) 47 + .filter(|name| !name.is_empty()) 48 + .collect::<Vec<String>>(); 49 + names.push(String::new()); 50 + Ok(names) 47 51 } 48 52 49 - pub fn parse_names(buf: &str) -> Result<Vec<String>, String> { 50 - todo!() 53 + pub fn names_equal(a: &[&str], b: &[&str]) -> bool { 54 + a.len() == b.len() && a.iter().zip(b.iter()).all(|(a, b)| a == b) 51 55 } 52 56 53 57 pub fn common_prefix_size(a: &ReftableBuf, b: &ReftableBuf) -> usize { 54 - todo!() 58 + let mut i = 0usize; 59 + while i < a.len() && i < b.len() && a[i] == b[i] { 60 + i += 1; 61 + } 62 + i 55 63 } 56 64 57 65 pub enum HashAlgorithm { ··· 59 67 Sha256 = 247, 60 68 } 61 69 62 - pub fn hash_size(id: HashAlgorithm) -> u32 { 63 - todo!() 64 - } 65 - 66 - #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 67 - pub enum ReftableHash { 68 - ReftableHashSha1 = 89, 69 - ReftableHashSha256 = 247, 70 + impl HashAlgorithm { 71 + pub fn size(&self) -> usize { 72 + match self { 73 + HashAlgorithm::Sha1 => REFTABLE_HASH_SIZE_SHA1, 74 + HashAlgorithm::Sha256 => REFTABLE_HASH_SIZE_SHA256, 75 + } 76 + } 70 77 }
+1 -1
src/reftable/block.rs
··· 1 - use crate::reftable::{basics::ReftableBuf, blocksource::ReftableBlockData}; 1 + use crate::reftable::{blocksource::ReftableBlockData, reftable_basics::ReftableBuf}; 2 2 use libz_sys::z_stream; 3 3 4 4 pub struct BlockWriter {
+1 -1
src/reftable/iter.rs
··· 1 1 use crate::reftable::{ 2 - basics::ReftableBuf, 3 2 block::{BlockIter, ReftableBlock}, 4 3 record::ReftableRecord, 4 + reftable_basics::ReftableBuf, 5 5 reftable_iterator::ReftableIterator, 6 6 reftable_table::ReftableTable, 7 7 };
+1 -1
src/reftable/record.rs
··· 1 - use crate::reftable::basics::ReftableBuf; 1 + use crate::reftable::reftable_basics::ReftableBuf; 2 2 3 3 pub const REFTABLE_HASH_SIZE_MAX: usize = 32; 4 4 pub const REFTABLE_HASH_SIZE_SHA1: usize = 20;
+2 -2
src/reftable/reftable_basics.rs
··· 1 1 use std::ffi::{c_char, c_uchar}; 2 2 3 3 /* A buffer that contains arbitrary byte slices. */ 4 - type ReftableBuf = Vec<c_char>; 4 + pub type ReftableBuf = Vec<c_char>; 5 5 6 6 /* 7 7 * Hash functions understood by the reftable library. Note that the values are 8 8 * arbitrary and somewhat random such that we can easily detect cases where the 9 9 * hash hasn't been properly set up. 10 10 */ 11 - enum ReftableHash { 11 + pub enum ReftableHash { 12 12 ReftableHashSha1 = 89, 13 13 ReftableHashSha256 = 247, 14 14 }
+2 -2
src/reftable/reftable_table.rs
··· 1 1 use crate::reftable::{ 2 - basics::ReftableHash, block::ReftableBlock, blocksource::ReftableBlockSource, iter::Void, 3 - reftable_iterator::ReftableIterator, 2 + block::ReftableBlock, blocksource::ReftableBlockSource, iter::Void, 3 + reftable_basics::ReftableHash, reftable_iterator::ReftableIterator, 4 4 }; 5 5 6 6 pub struct ReftableTableOffsets {