Use integer module to render integer

This commit is contained in:
Kogia-sima 2020-06-10 18:41:12 +09:00
parent c5015be783
commit c5a311e8c6
2 changed files with 24 additions and 3 deletions

View File

@ -48,6 +48,11 @@ impl Buffer {
}
}
#[inline]
pub fn as_mut_ptr(&self) -> *mut u8 {
self.data
}
#[inline]
pub fn len(&self) -> usize {
self.len

View File

@ -178,9 +178,17 @@ macro_rules! render_int {
impl Render for $int {
#[inline]
fn render(&self, b: &mut Buffer) -> Result<(), RenderError> {
let mut buffer = itoa::Buffer::new();
let s = buffer.format(*self);
b.push_str(s);
use super::integer::Integer;
if Self::MAX_LEN > b.capacity() - b.len() {
b.reserve(Self::MAX_LEN);
}
unsafe {
let ptr = b.as_mut_ptr().add(b.len());
let l = self.write_to(ptr);
b.set_len(b.len() + l);
}
Ok(())
}
@ -231,12 +239,16 @@ mod tests {
(&&1).render(&mut b).unwrap();
(&&&1).render(&mut b).unwrap();
(&&&&1).render(&mut b).unwrap();
assert_eq!(b.as_str(), "1111");
b.clear();
let v = 2.0;
(&v).render(&mut b).unwrap();
(&&v).render(&mut b).unwrap();
(&&&v).render(&mut b).unwrap();
(&&&&v).render(&mut b).unwrap();
assert_eq!(b.as_str(), "2.02.02.02.0");
b.clear();
let s = "apple";
(&*s).render_escaped(&mut b).unwrap();
@ -244,10 +256,14 @@ mod tests {
(&&s).render_escaped(&mut b).unwrap();
(&&&s).render_escaped(&mut b).unwrap();
(&&&&s).render_escaped(&mut b).unwrap();
assert_eq!(b.as_str(), "appleappleappleappleapple");
b.clear();
(&'c').render_escaped(&mut b).unwrap();
(&&'<').render_escaped(&mut b).unwrap();
(&&&'&').render_escaped(&mut b).unwrap();
(&&&&' ').render_escaped(&mut b).unwrap();
assert_eq!(b.as_str(), "c&lt;&amp; ");
b.clear();
}
}