non_empty_vec

Macro non_empty_vec 

Source
macro_rules! non_empty_vec {
    (@$vec:expr) => { ... };
    ($elem:expr; NZUsize!($n:expr)) => { ... };
    ($elem:expr; @$n:expr) => { ... };
    ($elem:expr; $n:expr) => { ... };
    ($first:expr $(, $rest:expr)* $(,)?) => { ... };
}
Expand description

Creates a NonEmptyVec containing the given elements.

§Forms

SyntaxCount typeGuarantee
non_empty_vec![a, b, c]-Compile-time (at least one element required)
non_empty_vec![elem; N]const usizeCompile-time (N must be const and > 0)
non_empty_vec![elem; NZUsize!(N)]NZUsize!Runtime (panics if N == 0)
non_empty_vec![elem; @n]NonZeroUsizeType-safe (n is already non-zero)
non_empty_vec![@v]-Runtime (panics if v is empty)

The @ marker is required for runtime NonZeroUsize values to distinguish them from const usize values, since declarative macros cannot inspect types.

§Examples

use commonware_utils::{non_empty_vec, NZUsize};

// List form
let v = non_empty_vec![1, 2, 3];
assert_eq!(v.len().get(), 3);

// Const repeat: N must be a const expression > 0
let v = non_empty_vec![42; 5];
assert_eq!(v.len().get(), 5);

// NZUsize! form: convenient for inline literals
let v = non_empty_vec![42; NZUsize!(3)];
assert_eq!(v.len().get(), 3);

// Runtime form: use @ with any NonZeroUsize expression
let n = NZUsize!(2);
let v = non_empty_vec![42; @n];
assert_eq!(v.len().get(), 2);

// Vec form: wrap an existing Vec (panics if empty)
let vec = vec![1, 2, 3];
let v = non_empty_vec![@vec];
assert_eq!(v.len().get(), 3);

§Compile Errors

use commonware_utils::non_empty_vec;
let empty = non_empty_vec![]; // error: no elements
use commonware_utils::non_empty_vec;
let zero = non_empty_vec![42; 0]; // error: count is 0
use commonware_utils::non_empty_vec;
let n: usize = 5;
let v = non_empty_vec![42; n]; // error: n is not const (use @n with NonZeroUsize)