use bumpalo::Bump;
use crate::DataValue;
use crate::arena::singletons;
pub trait ArenaExt<'a> {
fn null(&'a self) -> &'a DataValue<'a>;
fn bool(&'a self, b: bool) -> &'a DataValue<'a>;
fn i64(&'a self, n: i64) -> &'a DataValue<'a>;
fn f64(&'a self, n: f64) -> &'a DataValue<'a>;
fn string(&'a self, s: &str) -> &'a DataValue<'a>;
fn array(&'a self, items: &[DataValue<'a>]) -> &'a DataValue<'a>;
fn object(&'a self, pairs: &[(&'a str, DataValue<'a>)]) -> &'a DataValue<'a>;
}
impl<'a> ArenaExt<'a> for Bump {
#[inline]
fn null(&'a self) -> &'a DataValue<'a> {
singletons::singleton_null()
}
#[inline]
fn bool(&'a self, b: bool) -> &'a DataValue<'a> {
singletons::singleton_bool(b)
}
#[inline]
fn i64(&'a self, n: i64) -> &'a DataValue<'a> {
if let Some(s) = singletons::singleton_small_int(n) {
return s;
}
self.alloc(DataValue::from_i64(n))
}
#[inline]
fn f64(&'a self, n: f64) -> &'a DataValue<'a> {
self.alloc(DataValue::from_f64(n))
}
#[inline]
fn string(&'a self, s: &str) -> &'a DataValue<'a> {
if s.is_empty() {
return singletons::singleton_empty_string();
}
let s = self.alloc_str(s);
self.alloc(DataValue::String(s))
}
#[inline]
fn array(&'a self, items: &[DataValue<'a>]) -> &'a DataValue<'a> {
if items.is_empty() {
return singletons::singleton_empty_array();
}
let slice = self.alloc_slice_copy(items);
self.alloc(DataValue::Array(slice))
}
#[inline]
fn object(&'a self, pairs: &[(&'a str, DataValue<'a>)]) -> &'a DataValue<'a> {
if pairs.is_empty() {
return singletons::singleton_empty_object();
}
let slice = self.alloc_slice_copy(pairs);
self.alloc(DataValue::Object(slice))
}
}