#![doc = include_str!("../README.md")]
#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(feature = "std")]
extern crate std;
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(feature = "alloc")]
use alloc::string::String;
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
use core::clone::Clone;
use core::iter::IntoIterator;
use core::result::Result;
mod stack_buffer;
pub use stack_buffer::*;
mod ext;
pub use ext::*;
pub trait Barfer<T> {
type Error;
fn single(&mut self, value: T) -> Result<(), Self::Error>;
fn many<I: IntoIterator<Item = T>>(&mut self, iter: I) -> Result<(), Self::Error> {
for value in iter {
self.single(value)?;
}
Ok(())
}
fn slice<S: AsRef<[T]>>(&mut self, slice: S) -> Result<(), Self::Error>
where
T: Clone;
}
#[cfg(any(feature = "std", feature = "alloc"))]
impl<T> Barfer<T> for Vec<T> {
type Error = core::convert::Infallible;
#[inline]
fn single(&mut self, value: T) -> Result<(), Self::Error> {
self.push(value);
Ok(())
}
#[inline]
fn many<I: IntoIterator<Item = T>>(&mut self, iter: I) -> Result<(), Self::Error> {
self.extend(iter);
Ok(())
}
#[inline]
fn slice<S: AsRef<[T]>>(&mut self, slice: S) -> Result<(), Self::Error>
where
T: Clone,
{
self.extend_from_slice(slice.as_ref());
Ok(())
}
}
#[cfg(any(feature = "std", feature = "alloc"))]
impl Barfer<char> for String {
type Error = core::convert::Infallible;
#[inline]
fn single(&mut self, value: char) -> Result<(), Self::Error> {
self.push(value);
Ok(())
}
#[inline]
fn many<I: IntoIterator<Item = char>>(&mut self, iter: I) -> Result<(), Self::Error> {
self.extend(iter);
Ok(())
}
#[inline]
fn slice<S: AsRef<[char]>>(&mut self, slice: S) -> Result<(), Self::Error> {
let slice = slice.as_ref();
let mut buf = [0; 4];
for c in slice {
self.push_str(c.encode_utf8(&mut buf));
}
Ok(())
}
}