pub use core::any::Any;
pub use core::cell::{Cell, RefCell};
pub use core::fmt;
pub use core::hash::{Hash, Hasher};
pub use core::sync::atomic;
pub use core::time::Duration;
pub use alloc::boxed::Box;
pub use alloc::collections::BTreeMap;
pub use alloc::collections::VecDeque;
pub use alloc::format;
pub use alloc::rc::Rc;
pub use alloc::string::{String, ToString};
pub use alloc::sync::Arc;
pub use alloc::vec;
pub use alloc::vec::Vec;
#[cfg(feature = "mini")]
pub type MiniVec<T> = heapless::Vec<T, 64>;
#[cfg(not(feature = "mini"))]
pub type MiniVec<T> = alloc::vec::Vec<T>;
#[cfg(feature = "mini")]
pub type MiniString = heapless::String<256>;
#[cfg(not(feature = "mini"))]
pub type MiniString = alloc::string::String;
pub fn into_mini(s: &str) -> MiniString {
#[cfg(feature = "mini")]
{
let mut ms = MiniString::new();
let _ = ms.push_str(s);
ms
}
#[cfg(not(feature = "mini"))]
{
MiniString::from(s)
}
}
pub fn mini_string_from(s: String) -> MiniString {
#[cfg(feature = "mini")]
{
into_mini(&s)
}
#[cfg(not(feature = "mini"))]
{
s
}
}
#[cfg(feature = "mini")]
pub use alloc::collections::BTreeMap as HashMap;
#[cfg(not(feature = "mini"))]
pub use std::collections::HashMap;
#[cfg(feature = "mini")]
pub use core::cell::RefCell as Mutex;
#[cfg(not(feature = "mini"))]
pub use std::sync::Mutex;
#[cfg(feature = "mini")]
pub use core::cell::RefMut as MutexGuard;
#[cfg(not(feature = "mini"))]
pub use std::sync::MutexGuard;
#[cfg(feature = "mini")]
pub struct MiniArena {
bump: core::cell::RefCell<bumpalo::Bump>,
}
#[cfg(feature = "mini")]
impl MiniArena {
pub fn new() -> Self {
Self { bump: core::cell::RefCell::new(bumpalo::Bump::new()) }
}
pub fn alloc<T>(&self, val: T) -> &mut T {
self.bump.borrow_mut().alloc(val)
}
pub fn alloc_slice<T: Copy>(&self, slice: &[T]) -> &mut [T] {
self.bump.borrow_mut().alloc_slice_copy(slice)
}
pub fn reset(&self) {
self.bump.borrow_mut().reset();
}
pub fn allocated_bytes(&self) -> usize {
self.bump.borrow().allocated_bytes()
}
}
#[cfg(not(feature = "mini"))]
#[derive(Default)]
pub struct MiniArena;
#[cfg(not(feature = "mini"))]
impl MiniArena {
pub const fn new() -> Self {
Self
}
pub fn alloc<T>(&self, val: T) -> alloc::boxed::Box<T> {
alloc::boxed::Box::new(val)
}
pub fn alloc_slice<T: Copy>(&self, slice: &[T]) -> alloc::vec::Vec<T> {
slice.to_vec()
}
pub fn reset(&self) {}
pub fn allocated_bytes(&self) -> usize {
0
}
}
pub fn frame_arena() -> &'static MiniArena {
#[cfg(feature = "mini")]
{
use core::cell::UnsafeCell;
use core::mem::MaybeUninit;
use core::sync::atomic::{AtomicBool, Ordering};
static INIT: AtomicBool = AtomicBool::new(false);
static ARENA: UnsafeCell<MaybeUninit<MiniArena>> = UnsafeCell::new(MaybeUninit::uninit());
if !INIT.load(Ordering::Acquire) {
let arena = unsafe { &mut *ARENA.get() };
arena.write(MiniArena::new());
INIT.store(true, Ordering::Release);
}
unsafe { (*ARENA.get()).assume_init_ref() }
}
#[cfg(not(feature = "mini"))]
{
static ARENA: MiniArena = MiniArena::new();
&ARENA
}
}
pub fn reset_frame_arena() {
frame_arena().reset();
}