num_bigfloat/
util.rs

1//! Utility components.
2
3/// writable buffer.
4pub struct WritableBuf<'a> {
5    buf: &'a mut [u8],
6    offset: usize,
7}
8
9impl<'a> WritableBuf<'a> {
10    pub fn new(buf: &'a mut [u8]) -> Self {
11        WritableBuf { buf, offset: 0 }
12    }
13
14    pub fn len(&self) -> usize {
15        self.offset
16    }
17}
18
19impl<'a> core::fmt::Write for WritableBuf<'a> {
20    fn write_str(&mut self, s: &str) -> core::fmt::Result {
21        let bytes = s.as_bytes();
22        let rem = &mut self.buf[self.offset..];
23        if rem.len() < bytes.len() {
24            Err(core::fmt::Error)
25        } else {
26            let rem = &mut rem[..bytes.len()];
27            rem.copy_from_slice(bytes);
28            self.offset += bytes.len();
29            Ok(())
30        }
31    }
32}
33
34/// Concatenate several &str instances from `str_list` into one unsing buffer `buf`.
35pub fn concat_str<'a>(buf: &'a mut [u8], str_list: &[&str]) -> &'a str {
36    let mut p = 0;
37    for s in str_list {
38        let bytes = s.as_bytes();
39        buf[p..p + bytes.len()].copy_from_slice(bytes);
40        p += bytes.len();
41    }
42    if buf.len() > p + 1 {
43        buf[p] = 0;
44    }
45    core::str::from_utf8(&buf[0..p]).unwrap()
46}