//! Allocator-flexible data types // When std is enabled, prefer those types #[cfg(feature = "std")] pub(crate) use self::std::*; // When alloc but not std is enabled, use those types #[cfg(all(feature = "alloc", not(feature = "std")))] pub(crate) use self::alloc::*; // When neither alloc or std is enabled, use a heapless fallback #[cfg(all(not(feature = "alloc"), not(feature = "std")))] pub(crate) use self::core::*; /// For when `std` is enabled #[cfg(feature = "std")] mod std { /// An allocation-backend agnostic vector type pub(crate) type Vec = std::vec::Vec; /// A vector of child nodes pub(crate) type ChildrenVec = std::vec::Vec; #[cfg(feature = "grid")] /// A vector of grid tracks pub(crate) type GridTrackVec = std::vec::Vec; /// Creates a new vector with the capacity for the specified number of items before it must be resized #[must_use] pub(crate) fn new_vec_with_capacity(capacity: usize) -> Vec { Vec::with_capacity(capacity) } /// Rounds to the nearest whole number #[must_use] #[inline(always)] pub(crate) fn round(value: f32) -> f32 { value.round() } /// Computes the absolute value #[must_use] #[inline(always)] pub(crate) fn abs(value: f32) -> f32 { value.abs() } /// Returns the largest of two f32 values #[inline(always)] pub(crate) fn f32_max(a: f32, b: f32) -> f32 { a.max(b) } /// Returns the smallest of two f32 values #[inline(always)] pub(crate) fn f32_min(a: f32, b: f32) -> f32 { a.min(b) } } /// For when `alloc` but not `std` is enabled #[cfg(all(feature = "alloc", not(feature = "std")))] mod alloc { extern crate alloc; use core::cmp::Ordering; /// An allocation-backend agnostic vector type pub(crate) type Vec = alloc::vec::Vec; /// A vector of child nodes pub(crate) type ChildrenVec = alloc::vec::Vec; #[cfg(feature = "grid")] /// A vector of grid tracks pub(crate) type GridTrackVec = alloc::vec::Vec; /// Creates a new vector with the capacity for the specified number of items before it must be resized #[must_use] pub(crate) fn new_vec_with_capacity(capacity: usize) -> Vec { Vec::with_capacity(capacity) } /// Rounds to the nearest whole number #[must_use] #[inline(always)] pub(crate) fn round(value: f32) -> f32 { num_traits::float::FloatCore::round(value) } /// Computes the absolute value #[must_use] #[inline(always)] pub(crate) fn abs(value: f32) -> f32 { num_traits::float::FloatCore::abs(value) } /// Returns the largest of two f32 values #[inline(always)] pub(crate) fn f32_max(a: f32, b: f32) -> f32 { a.max(b) } /// Returns the smallest of two f32 values #[inline(always)] pub(crate) fn f32_min(a: f32, b: f32) -> f32 { a.min(b) } } /// For when neither `alloc` nor `std` is enabled #[cfg(all(not(feature = "alloc"), not(feature = "std")))] mod core { use core::cmp::Ordering; /// The maximum number of nodes in the tree pub const MAX_NODE_COUNT: usize = 256; /// The maximum number of children of any given node pub const MAX_CHILD_COUNT: usize = 16; #[cfg(feature = "grid")] /// The maximum number of children of any given node pub const MAX_GRID_TRACKS: usize = 16; /// An allocation-backend agnostic vector type pub(crate) type Vec = arrayvec::ArrayVec; /// A vector of child nodes, whose length cannot exceed [`MAX_CHILD_COUNT`] pub(crate) type ChildrenVec = arrayvec::ArrayVec; #[cfg(feature = "grid")] /// A vector of grid tracks pub(crate) type GridTrackVec = arrayvec::ArrayVec; /// Creates a new map with the capacity for the specified number of items before it must be resized /// /// This vector cannot be resized. #[must_use] pub(crate) fn new_vec_with_capacity(_capacity: usize) -> arrayvec::ArrayVec { arrayvec::ArrayVec::new() } /// Rounds to the nearest whole number #[inline] #[must_use] #[inline(always)] pub(crate) fn round(value: f32) -> f32 { num_traits::float::FloatCore::round(value) } /// Computes the absolute value #[inline] #[must_use] #[inline(always)] pub(crate) fn abs(value: f32) -> f32 { num_traits::float::FloatCore::abs(value) } /// Returns the largest of two f32 values #[inline(always)] pub(crate) fn f32_max(a: f32, b: f32) -> f32 { a.max(b) } /// Returns the smallest of two f32 values #[inline(always)] pub(crate) fn f32_min(a: f32, b: f32) -> f32 { a.min(b) } }