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
| Syntax | Count type | Guarantee |
|---|---|---|
non_empty_vec![a, b, c] | - | Compile-time (at least one element required) |
non_empty_vec![elem; N] | const usize | Compile-time (N must be const and > 0) |
non_empty_vec![elem; NZUsize!(N)] | NZUsize! | Runtime (panics if N == 0) |
non_empty_vec![elem; @n] | NonZeroUsize | Type-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)