1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
//! 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<A> = std::vec::Vec<A>;
/// A vector of child nodes
pub(crate) type ChildrenVec<A> = std::vec::Vec<A>;
#[cfg(feature = "grid")]
/// A vector of grid tracks
pub(crate) type GridTrackVec<A> = std::vec::Vec<A>;
/// 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<A>(capacity: usize) -> Vec<A> {
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<A> = alloc::vec::Vec<A>;
/// A vector of child nodes
pub(crate) type ChildrenVec<A> = alloc::vec::Vec<A>;
#[cfg(feature = "grid")]
/// A vector of grid tracks
pub(crate) type GridTrackVec<A> = alloc::vec::Vec<A>;
/// 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<A>(capacity: usize) -> Vec<A> {
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<A> = arrayvec::ArrayVec<A, MAX_NODE_COUNT>;
/// A vector of child nodes, whose length cannot exceed [`MAX_CHILD_COUNT`]
pub(crate) type ChildrenVec<A> = arrayvec::ArrayVec<A, MAX_CHILD_COUNT>;
#[cfg(feature = "grid")]
/// A vector of grid tracks
pub(crate) type GridTrackVec<A> = arrayvec::ArrayVec<A, MAX_GRID_TRACKS>;
/// 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<A, const CAP: usize>(_capacity: usize) -> arrayvec::ArrayVec<A, CAP> {
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)
}
}