macro_rules! bitarr {
(for $len:expr, in $order:ty, $store:ident) => { ... };
(for $len:expr, in $store:ident) => { ... };
(for $len:expr) => { ... };
($order:ident, Cell<$store:ident>; $($val:expr),* $(,)?) => { ... };
($order:ident, $store:ident; $($val:expr),* $(,)?) => { ... };
($order:path, Cell<$store:ident>; $($val:expr),* $(,)?) => { ... };
($order:path, $store:ident; $($val:expr),* $(,)?) => { ... };
($order:ident; $($val:expr),* $(,)?) => { ... };
($order:path; $($val:expr),* $(,)?) => { ... };
($order:ident, Cell<$store:ident>; $val:expr; $len:expr) => { ... };
($order:ident, $store:ident; $val:expr; $len:expr) => { ... };
($order:path, Cell<$store:ident>; $val:expr; $len:expr) => { ... };
($order:path, $store:ident; $val:expr; $len:expr) => { ... };
($order:ident; $val:expr; $len:expr) => { ... };
($order:path; $val:expr; $len:expr) => { ... };
($($val:expr),* $(,)?) => { ... };
($val:expr; $len:expr) => { ... };
}
Expand description
Constructs a new BitArray
from a bit-pattern description.
This macro takes a superset of the vec!
argument syntax: it may be invoked
with either a sequence of bit expressions, or a single bit expression and a
repetition counter. Additionally, you may provide the names of a BitOrder
and a BitStore
implementor as the BitArray
’s type arguments.
Argument Rules
Bit expressions must be integer literals. Ambiguity restrictions in the macro
syntax forbid the use of identifiers to existing variables, even const
values.
These are converted to bool
through the expression $val != 0
. Any non-zero
enteger becomes true
, and 0
becomes false
.
You may use any name or path to a BitOrder
implementation. However, the
identifier tokens Lsb0
, Msb0
, and LocalBits
are matched directly and
specialized to have compile-time constructions, whereäs any other name or path
will not be known to the macro, and will execute at runtime.
The BitStore
argument must be the name of an unsigned integer
fundamental, an atomic, or a Cell<>
wrapper of that unsigned integer. These
are matched by token, not by type, and no other identifier is accepted. Using
any other token will cause the macro to fail.
Type Name Construction
In addition to the value construction, this macro can also construct the name of
a BitArray
type that contains a requested number of bits. This is useful
for typing a binding before constructing a value for it.
The argument syntax for this is a for $BITS
, optionally followed by , $TYPE
or , $ORDER, $TYPE
. $BITS
may be any constant-evaluable usize
expression.
$ORDER
and TYPE
may be any valid names or paths for the appropriate trait
implementations.
Examples
use bitvec::prelude::*;
use core::cell::Cell;
radium::if_atomic! { if atomic(32) {
use core::sync::atomic::AtomicU32;
} }
let a: BitArray = bitarr![0, 1, 0, 1, 2];
assert_eq!(a.count_ones(), 3);
let b: BitArray = bitarr![2; 5];
assert!(b.all());
assert!(b.len() >= 5);
let c = bitarr![Lsb0, Cell<u16>; 0, 1, 0, 0, 1];
let d = bitarr![Msb0, AtomicU32; 0, 0, 1, 0, 1];
let e: bitarr!(for 20, in LocalBits, u8) = bitarr![LocalBits, u8; 0; 20];