use smallvec::{Array, SmallVec};
use vyre_driver::{reservation_policy::ReservationPolicy, BackendError};
pub(crate) fn reserve_vec<T>(
vec: &mut Vec<T>,
additional: usize,
context: &'static str,
item: &'static str,
fix: &'static str,
) -> Result<(), BackendError> {
ReservationPolicy::new(context, fix).reserve_vec_additional(vec, additional, item)
}
pub(crate) fn reserve_vec_exact_for_len<T>(
vec: &mut Vec<T>,
target_len: usize,
context: &'static str,
item: &'static str,
fix: &'static str,
) -> Result<(), BackendError> {
ReservationPolicy::new(context, fix).reserve_vec_exact_for_len(vec, target_len, item)
}
pub(crate) fn reserve_smallvec<A>(
vec: &mut SmallVec<A>,
additional: usize,
context: &'static str,
item: &'static str,
fix: &'static str,
) -> Result<(), BackendError>
where
A: Array,
{
ReservationPolicy::new(context, fix).reserve_smallvec_additional(vec, additional, item)
}
pub(crate) fn reserve_backend_vec<T>(
vec: &mut Vec<T>,
additional: usize,
context: &'static str,
) -> Result<(), BackendError> {
reserve_vec(
vec,
additional,
context,
"slot",
"split the dispatch batch or reduce parallelism",
)
}
pub(crate) fn reserve_pipeline_vec<T>(
vec: &mut Vec<T>,
additional: usize,
context: &'static str,
) -> Result<(), BackendError> {
reserve_vec(
vec,
additional,
context,
"buffer",
"reduce output binding count or pipeline batch size",
)
}
pub(crate) fn reserve_multi_gpu_vec<T>(
vec: &mut Vec<T>,
additional: usize,
context: &'static str,
) -> Result<(), BackendError> {
reserve_vec(
vec,
additional,
context,
"item",
"reduce active GPU count or shard the workload",
)
}
#[cfg(test)]
mod tests {
use super::{reserve_smallvec, reserve_vec, reserve_vec_exact_for_len};
use smallvec::SmallVec;
#[test]
fn generated_staging_reserve_helpers_grow_without_mutating_lengths() {
let mut vec = vec![1u8, 2, 3];
reserve_vec(
&mut vec,
17,
"generated WGPU reservation test",
"byte",
"split the generated batch",
)
.expect("Fix: generated Vec reservation should succeed");
assert_eq!(vec, vec![1u8, 2, 3]);
assert!(vec.capacity() >= 20);
let mut exact = vec![9u8];
reserve_vec_exact_for_len(
&mut exact,
33,
"generated WGPU exact reservation test",
"slot",
"split the generated batch",
)
.expect("Fix: generated exact Vec reservation should succeed");
assert_eq!(exact, vec![9u8]);
assert!(exact.capacity() >= 33);
let mut small = SmallVec::<[u8; 2]>::new();
small.push(7);
reserve_smallvec(
&mut small,
19,
"generated WGPU SmallVec reservation test",
"item",
"split the generated batch",
)
.expect("Fix: generated SmallVec reservation should succeed");
assert_eq!(small.as_slice(), &[7]);
assert!(small.capacity() >= 20);
}
}