#[cfg(feature = "std")]
pub(crate) use self::std::*;
#[cfg(all(feature = "alloc", not(feature = "std")))]
pub(crate) use self::alloc::*;
#[cfg(all(not(feature = "alloc"), not(feature = "std")))]
pub(crate) use self::core::*;
#[cfg(feature = "std")]
mod std {
pub(crate) use std::format;
pub(crate) type String = std::string::String;
pub(crate) type DefaultCheapStr = String;
pub(crate) type Map<K, V> = std::collections::HashMap<K, V, std::collections::hash_map::RandomState>;
pub(crate) type Vec<A> = std::vec::Vec<A>;
pub(crate) type ChildrenVec<A> = std::vec::Vec<A>;
#[cfg(feature = "grid")]
pub(crate) type GridTrackVec<A> = std::vec::Vec<A>;
#[must_use]
pub(crate) fn new_vec_with_capacity<A>(capacity: usize) -> Vec<A> {
Vec::with_capacity(capacity)
}
#[must_use]
pub(crate) fn single_value_vec<A>(value: A) -> Vec<A> {
vec![value]
}
#[must_use]
#[inline(always)]
pub(crate) fn round(value: f32) -> f32 {
(value + 0.5).floor()
}
#[must_use]
#[inline(always)]
pub(crate) fn ceil(value: f32) -> f32 {
value.ceil()
}
#[must_use]
#[inline(always)]
pub(crate) fn floor(value: f32) -> f32 {
value.floor()
}
#[must_use]
#[inline(always)]
pub(crate) fn abs(value: f32) -> f32 {
value.abs()
}
#[inline(always)]
pub(crate) fn f32_max(a: f32, b: f32) -> f32 {
a.max(b)
}
#[inline(always)]
pub(crate) fn f32_min(a: f32, b: f32) -> f32 {
a.min(b)
}
}
#[cfg(all(feature = "alloc", not(feature = "std")))]
mod alloc {
extern crate alloc;
use core::cmp::Ordering;
pub(crate) use alloc::format;
pub(crate) type String = alloc::string::String;
pub(crate) type DefaultCheapStr = String;
pub(crate) type Map<K, V> = alloc::collections::BTreeMap<K, V>;
pub(crate) type Vec<A> = alloc::vec::Vec<A>;
pub(crate) type ChildrenVec<A> = alloc::vec::Vec<A>;
#[cfg(feature = "grid")]
pub(crate) type GridTrackVec<A> = alloc::vec::Vec<A>;
#[must_use]
pub(crate) fn new_vec_with_capacity<A>(capacity: usize) -> Vec<A> {
Vec::with_capacity(capacity)
}
#[must_use]
pub(crate) fn single_value_vec<A>(value: A) -> Vec<A> {
let mut vec = Vec::with_capacity(1);
vec.push(value);
vec
}
pub(crate) use super::polyfill::round;
pub(crate) use super::polyfill::ceil;
pub(crate) use super::polyfill::floor;
pub(crate) use super::polyfill::abs;
#[inline(always)]
pub(crate) fn f32_max(a: f32, b: f32) -> f32 {
a.max(b)
}
#[inline(always)]
pub(crate) fn f32_min(a: f32, b: f32) -> f32 {
a.min(b)
}
}
#[cfg(all(not(feature = "alloc"), not(feature = "std")))]
mod core {
use core::cmp::Ordering;
pub const MAX_NODE_COUNT: usize = 256;
pub const MAX_CHILD_COUNT: usize = 16;
#[cfg(feature = "grid")]
pub const MAX_GRID_TRACKS: usize = 16;
pub(crate) type String = &'static str;
pub(crate) type DefaultCheapStr = &'static str;
pub(crate) type Vec<A> = arrayvec::ArrayVec<A, MAX_NODE_COUNT>;
pub(crate) type ChildrenVec<A> = arrayvec::ArrayVec<A, MAX_CHILD_COUNT>;
#[cfg(feature = "grid")]
pub(crate) type GridTrackVec<A> = arrayvec::ArrayVec<A, MAX_GRID_TRACKS>;
#[must_use]
pub(crate) fn new_vec_with_capacity<A, const CAP: usize>(_capacity: usize) -> arrayvec::ArrayVec<A, CAP> {
arrayvec::ArrayVec::new()
}
#[must_use]
pub(crate) fn single_value_vec<A, const CAP: usize>(value: A) -> arrayvec::ArrayVec<A, CAP> {
let mut vec = new_vec_with_capacity(1);
vec.push(value);
vec
}
pub(crate) use super::polyfill::round;
pub(crate) use super::polyfill::abs;
#[inline(always)]
pub(crate) fn f32_max(a: f32, b: f32) -> f32 {
a.max(b)
}
#[inline(always)]
pub(crate) fn f32_min(a: f32, b: f32) -> f32 {
a.min(b)
}
}
#[cfg(not(feature = "std"))]
mod polyfill {
#[must_use]
#[inline(always)]
fn fract(value: f32) -> f32 {
if value == 0.0 {
0.0
} else {
value % 1.0
}
}
#[must_use]
#[inline(always)]
pub(crate) fn round(value: f32) -> f32 {
let f = fract(value);
if f.is_nan() || f == 0.0 {
value
} else if value > 0.0 {
if f < 0.5 {
value - f
} else {
value - f + 1.0
}
} else if -f < 0.5 {
value - f
} else {
value - f - 1.0
}
}
#[must_use]
#[inline(always)]
pub(crate) fn floor(value: f32) -> f32 {
let f = fract(value);
if f.is_nan() || f == 0.0 {
value
} else if value < 0.0 {
value - f - 1.0
} else {
value - f
}
}
#[must_use]
#[inline(always)]
pub(crate) fn ceil(value: f32) -> f32 {
let f = fract(value);
if f.is_nan() || f == 0.0 {
value
} else if value > 0.0 {
value - f + 1.0
} else {
value - f
}
}
#[must_use]
#[inline(always)]
pub(crate) fn abs(value: f32) -> f32 {
if value.is_sign_positive() {
return value;
} else if value.is_sign_negative() {
return -value;
} else {
f32::NAN
}
}
}