compressed_intvec/seq/macros.rs
1//! Convenience macros for creating a [`SeqVec`] with a familiar syntax.
2//!
3//! [`SeqVec`]: crate::seq::SeqVec
4
5/// Creates a [`LESeqVec`] containing the given sequences.
6///
7/// This macro constructs a [`SeqVec`] with little-endian encoding and automatic
8/// codec selection, using the default `u64` word type for storage.
9///
10/// # Examples
11///
12/// ```
13/// use compressed_intvec::seq_vec;
14///
15/// let v = seq_vec![[1u32, 2, 3], [10u32, 20], [100u32]];
16/// assert_eq!(v.num_sequences(), 3);
17/// assert_eq!(v.get(0).unwrap().collect::<Vec<_>>(), vec![1u32, 2, 3]);
18/// assert_eq!(v.get(1).unwrap().collect::<Vec<_>>(), vec![10u32, 20]);
19/// assert_eq!(v.get(2).unwrap().collect::<Vec<_>>(), vec![100u32]);
20/// ```
21///
22/// # Notes
23///
24/// - Empty sequences are supported: `seq_vec![[1, 2], [], [3]]`.
25/// - All elements in a sequence must be the same type.
26/// - The macro uses [`from_slices`] internally, which performs codec analysis.
27///
28/// [`LESeqVec`]: crate::seq::LESeqVec
29/// [`SeqVec`]: crate::seq::SeqVec
30/// [`from_slices`]: crate::seq::SeqVec::from_slices
31#[macro_export]
32macro_rules! seq_vec {
33 // Empty case: seq_vec![]
34 () => {
35 $crate::seq::SeqVec::<u64, ::dsi_bitstream::prelude::LE>::builder()
36 .build(&[] as &[&[u64]])
37 .unwrap()
38 };
39 // One or more sequences: seq_vec![[1, 2], [3, 4]]
40 ($([$($elem:expr),* $(,)?]),* $(,)?) => {
41 $crate::seq::SeqVec::<_, ::dsi_bitstream::prelude::LE>::from_slices(&[
42 $(&[$($elem),*] as &[_]),*
43 ]).unwrap()
44 };
45}
46
47/// Creates a [`LESeqVec`] of signed integers (forces `i64`).
48///
49/// This macro is similar to [`seq_vec!`], but automatically
50/// casts all elements to `i64` before creating the vector. This ensures
51/// that ZigZag encoding is used for compression.
52///
53/// # Examples
54///
55/// ```
56/// use compressed_intvec::sseq_vec;
57/// use compressed_intvec::seq::LESeqVec;
58///
59/// let v: LESeqVec<i64> = sseq_vec![[-1, -2, 3], [10, -20], [-100]];
60/// assert_eq!(v.num_sequences(), 3);
61/// assert_eq!(v.get(0).unwrap().collect::<Vec<_>>(), vec![-1, -2, 3]);
62/// ```
63///
64/// [`LESeqVec`]: crate::seq::LESeqVec
65#[macro_export]
66macro_rules! sseq_vec {
67 // Empty case
68 () => {
69 $crate::seq::SeqVec::<i64, ::dsi_bitstream::prelude::LE>::builder()
70 .build(&[] as &[&[i64]])
71 .unwrap()
72 };
73 // One or more sequences with automatic casting to i64
74 ($([$($elem:expr),* $(,)?]),* $(,)?) => {
75 $crate::seq::SeqVec::from_slices(&[
76 $(&[$($elem as i64),*] as &[_]),*
77 ]).unwrap()
78 };
79}