io_engine/buffer/
utils.rs1use rand::{Rng, distr::Alphanumeric, rng};
2
3extern crate libc;
4
5#[inline]
6pub fn safe_copy(dst: &mut [u8], src: &[u8]) -> usize {
7 let len = dst.len();
8 let other_len = src.len();
9 if other_len > len {
10 dst.copy_from_slice(&src[0..len]);
11 return len;
12 } else if other_len < len {
13 dst[0..other_len].copy_from_slice(src);
14 return other_len;
15 } else {
16 dst.copy_from_slice(src);
17 return len;
18 }
19}
20
21#[inline(always)]
22pub fn set_zero(dst: &mut [u8]) {
23 unsafe {
24 libc::memset(dst.as_mut_ptr() as *mut libc::c_void, 0, dst.len());
25 }
26}
27
28#[inline]
30pub fn rand_buffer<T: AsMut<[u8]>>(dst: &mut T) {
31 let s: &mut [u8] = dst.as_mut();
32 let len = s.len();
33 let mut rng = rng();
34 for i in 0..len {
35 s[i] = rng.sample(Alphanumeric) as u8;
36 }
37}
38
39#[inline(always)]
40pub fn is_all_zero(s: &[u8]) -> bool {
41 for c in s {
42 if *c != 0 {
43 return false;
44 }
45 }
46 true
47}
48
49#[cfg(test)]
50mod tests {
51
52 extern crate md5;
53 use super::*;
54
55 #[test]
56 fn test_safe_copy() {
57 let buf1: [u8; 10] = [0; 10];
58 let mut buf2: [u8; 10] = [1; 10];
59 let mut buf3: [u8; 10] = [2; 10];
60 let zero: usize = 0;
61 assert_eq!(0, safe_copy(&mut buf2[0..zero], &buf3));
63 assert_eq!(&buf2, &[1; 10]);
64 assert_eq!(0, safe_copy(&mut buf2[10..], &buf3));
65 assert_eq!(&buf2, &[1; 10]);
66 assert_eq!(10, safe_copy(&mut buf2, &buf1));
70 assert_eq!(buf1, buf2);
71 assert_eq!(5, safe_copy(&mut buf2[5..], &buf3));
72 assert_eq!(buf1[0..5], buf2[0..5]);
73 assert_eq!(buf2[5..], buf3[5..]);
74 assert_eq!(5, safe_copy(&mut buf3[0..5], &buf1));
75 assert_eq!(buf2, buf3);
76 }
77
78 #[test]
79 fn test_rand_buffer() {
80 let mut buf1: [u8; 10] = [0; 10];
81 let mut buf2: [u8; 10] = [0; 10];
82 rand_buffer(&mut buf1);
83 rand_buffer(&mut buf2);
84 assert!(md5::compute(&buf1) != md5::compute(&buf2));
85 }
86
87 #[test]
88 fn test_set_zero() {
89 let mut buf1: [u8; 10] = [1; 10];
90 set_zero(&mut buf1);
91 for i in &buf1 {
92 assert_eq!(*i, 0)
93 }
94 }
95}