Skip to main content

scatter_into_uninit

Function scatter_into_uninit 

Source
pub unsafe fn scatter_into_uninit<'a, T, I>(
    plan: &ScatterPlan,
    dest: &'a mut RawStridedMut<'a, MaybeUninit<T>>,
    operand: &RawStridedRef<'_, T>,
    scatter_indices: &RawStridedRef<'_, I>,
    updates: &RawStridedRef<'_, T>,
    combine: fn(T, T) -> T,
) -> Result<()>
where T: Copy + Add<Output = T> + MaybeSendSync, I: GatherIndex,
Expand description

Full-overwrite indexed replay for an operation-family adapter.

§Safety

The adapter must reject input/output overlap before creating the input references. All descriptor allocation and initialization contracts must remain valid for the call. Output slots may be uninitialized; the owning plan retains its checked layout/index validation and private initialization receipt. No initialized reference to the output backing may be formed. Copy the operand before additive scatter into its initialized logical slots.

§Examples

use strided_basic::{RawStridedRef, RawStridedMut};
use strided_basic::execution::*;
use core::mem::MaybeUninit;
use strided_basic::{ScatterPlan, ScatterSpec};
let spec = ScatterSpec { update_window_dims: vec![], inserted_window_dims: vec![0], scatter_dims_to_operand_dims: vec![0], index_vector_dim: 1 };
let plan = ScatterPlan::compile(&[3], &[1], &[1, 1], &[1, 1], &[1], &[1], &[3], &[1], spec).unwrap();
let src = RawStridedRef::new(&[1_i32, 2, 3], &[3], &[1], 0).unwrap();
let update = RawStridedRef::new(&[9_i32], &[1], &[1], 0).unwrap();
let indices = RawStridedRef::new(&[1_i64], &[1, 1], &[1, 1], 0).unwrap();
let mut values = [MaybeUninit::<i32>::uninit(); 3];
let mut dst = RawStridedMut::new(&mut values, &[3], &[1], 0).unwrap();
// SAFETY: all inputs are initialized and disjoint from the matching output.
unsafe { scatter_into_uninit(&plan, &mut dst, &src, &indices, &update, i32::wrapping_add) }.unwrap();
assert_eq!(unsafe { values[1].assume_init() }, 11);

§Errors

Forwards the plan layout/index validation errors.