[][src]Function inplace_it::try_inplace_array

pub fn try_inplace_array<T, R, Consumer>(
    size: usize,
    consumer: Consumer
) -> Result<R, Consumer> where
    Consumer: FnOnce(UninitializedSliceMemoryGuard<T>) -> R, 

try_inplace_array trying to place an array of T on the stack and pass the guard of memory into the consumer closure. consumer's result will be returned as Ok(result).

If the result of array of T is more than 4096 then Err(consumer) will be returned.

Sometimes size of allocated array might be more than requested. For sizes larger than 32, the following formula is used: roundUp(size/32)*32. This is a simplification that used for keeping code short, simple and able to optimize. For example, for requested 50 item [T; 64] will be allocated. For 120 items - [T; 128] and so on.

Note that rounding size up is working for fixed-sized arrays only. If function decides to allocate a vector then its size will be equal to requested.

Examples

use inplace_it::{
    try_inplace_array,
    UninitializedSliceMemoryGuard,
};

let sum = try_inplace_array(100, |uninit_guard: UninitializedSliceMemoryGuard<u16>| {
    assert_eq!(uninit_guard.len(), 128);
    // For now, our memory is placed/allocated but uninitialized.
    // Let's initialize it!
    let guard = uninit_guard.init(|index| index as u16 * 2);
    // For now, memory contains content like [0, 2, 4, 6, ..., 252, 254]
    let sum: u16 = guard.iter().sum();
    sum
});
// Sum of [0, 2, 4, 6, ..., 252, 254] = sum of [0, 1, 2, 3, ..., 126, 127] * 2 = ( 127 * (127+1) ) / 2 * 2
match sum {
    Ok(sum) => assert_eq!(sum, 127 * 128),
    Err(_) => unreachable!("Placing fails"),
};