Created
November 7, 2020 10:40
-
-
Save andelf/29c609f12363db903f9d44ed4c50aba2 to your computer and use it in GitHub Desktop.
Non-alloc string formatter for embedded Rust
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use core::fmt::{self, Write}; | |
use core::str; | |
fn main() { | |
// For LCD 160 / 8 = 20 chars | |
let mut buf = [0u8; 20]; | |
let mut buf = ByteMutWriter::new(&mut buf[..]); | |
buf.clear(); | |
write!(&mut buf, "Hello {}!", "Rust").unwrap(); | |
// buf.as_str() | |
} | |
pub struct ByteMutWriter<'a> { | |
buf: &'a mut [u8], | |
cursor: usize, | |
} | |
impl<'a> ByteMutWriter<'a> { | |
pub fn new(buf: &'a mut [u8]) -> Self { | |
ByteMutWriter { buf, cursor: 0 } | |
} | |
pub fn as_str(&self) -> &str { | |
str::from_utf8(&self.buf[0..self.cursor]).unwrap() | |
} | |
#[inline] | |
pub fn capacity(&self) -> usize { | |
self.buf.len() | |
} | |
pub fn clear(&mut self) { | |
self.cursor = 0; | |
} | |
pub fn len(&self) -> usize { | |
self.cursor | |
} | |
pub fn empty(&self) -> bool { | |
self.cursor == 0 | |
} | |
pub fn full(&self) -> bool { | |
self.capacity() == self.cursor | |
} | |
} | |
impl fmt::Write for ByteMutWriter<'_> { | |
fn write_str(&mut self, s: &str) -> fmt::Result { | |
let cap = self.capacity(); | |
for (i, &b) in self.buf[self.cursor..cap] | |
.iter_mut() | |
.zip(s.as_bytes().iter()) | |
{ | |
*i = b; | |
} | |
self.cursor = usize::min(cap, self.cursor + s.as_bytes().len()); | |
Ok(()) | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment