use alloc::string::String;
use core::fmt;
use crate::{CheetahStr, CheetahString};
#[derive(Clone, Default)]
pub struct CheetahBuilder {
inner: String,
}
impl CheetahBuilder {
#[inline]
pub fn new() -> Self {
Self {
inner: String::new(),
}
}
#[inline]
pub fn with_capacity(capacity: usize) -> Self {
Self {
inner: String::with_capacity(capacity),
}
}
#[inline]
pub fn from_string(value: String) -> Self {
Self { inner: value }
}
#[inline]
pub fn push_str(&mut self, value: &str) {
self.inner.push_str(value);
}
#[inline]
pub fn push(&mut self, value: char) {
self.inner.push(value);
}
#[inline]
pub fn reserve(&mut self, additional: usize) {
self.inner.reserve(additional);
}
#[inline]
pub fn clear(&mut self) {
self.inner.clear();
}
#[inline]
pub fn as_str(&self) -> &str {
self.inner.as_str()
}
#[inline]
pub fn len(&self) -> usize {
self.inner.len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
#[inline]
pub fn capacity(&self) -> usize {
self.inner.capacity()
}
#[inline]
pub fn finish_string(self) -> CheetahString {
CheetahString::from_string_owned(self.inner)
}
#[inline]
pub fn finish_str(self) -> CheetahStr {
CheetahStr::from_string(self.inner)
}
#[inline]
pub fn into_string(self) -> String {
self.inner
}
}
impl From<String> for CheetahBuilder {
#[inline]
fn from(value: String) -> Self {
Self::from_string(value)
}
}
impl From<&str> for CheetahBuilder {
#[inline]
fn from(value: &str) -> Self {
let mut builder = Self::with_capacity(value.len());
builder.push_str(value);
builder
}
}
impl Extend<char> for CheetahBuilder {
#[inline]
fn extend<T: IntoIterator<Item = char>>(&mut self, iter: T) {
self.inner.extend(iter);
}
}
impl<'a> Extend<&'a str> for CheetahBuilder {
#[inline]
fn extend<T: IntoIterator<Item = &'a str>>(&mut self, iter: T) {
for item in iter {
self.push_str(item);
}
}
}
impl fmt::Debug for CheetahBuilder {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("CheetahBuilder")
.field("value", &self.inner)
.field("capacity", &self.inner.capacity())
.finish()
}
}