musli_core/en/
utils.rs

1use crate::Context;
2
3use super::{Encode, Encoder, SequenceEncoder};
4
5/// The default implementation of [`Encoder::encode_slice`].
6#[inline]
7pub fn default_encode_slice<E, T>(encoder: E, slice: impl AsRef<[T]>) -> Result<(), E::Error>
8where
9    E: Encoder,
10    T: Encode<E::Mode>,
11{
12    let cx = encoder.cx();
13    let slice = slice.as_ref();
14    let mut seq = encoder.encode_sequence(slice.len())?;
15
16    for (index, item) in slice.iter().enumerate() {
17        cx.enter_sequence_index(index);
18        seq.push(item)?;
19        cx.leave_sequence_index();
20    }
21
22    seq.finish_sequence()
23}
24
25/// The default implementation of [`Encoder::encode_slices`].
26#[inline]
27pub fn default_encode_slices<E, T>(
28    encoder: E,
29    len: usize,
30    slices: impl IntoIterator<Item: AsRef<[T]>>,
31) -> Result<(), E::Error>
32where
33    E: Encoder,
34    T: Encode<E::Mode>,
35{
36    let cx = encoder.cx();
37
38    let mut seq = encoder.encode_sequence(len)?;
39
40    let mut index = 0;
41
42    for slice in slices {
43        for item in slice.as_ref() {
44            cx.enter_sequence_index(index);
45            seq.push(item)?;
46            cx.leave_sequence_index();
47            index = index.wrapping_add(1);
48        }
49    }
50
51    seq.finish_sequence()
52}
53
54/// The default implementation of [`SequenceEncoder::encode_slice`].
55#[inline]
56pub fn default_sequence_encode_slice<E, T>(
57    seq: &mut E,
58    slice: impl AsRef<[T]>,
59) -> Result<(), E::Error>
60where
61    E: ?Sized + SequenceEncoder,
62    T: Encode<E::Mode>,
63{
64    let cx = seq.cx();
65
66    let mut index = 0usize;
67
68    for value in slice.as_ref() {
69        cx.enter_sequence_index(index);
70        seq.push(value)?;
71        cx.leave_sequence_index();
72        index = index.wrapping_add(1);
73    }
74
75    Ok(())
76}
77
78/// The default implementation of [`SequenceEncoder::encode_slices`].
79#[inline]
80pub fn default_sequence_encode_slices<E, T>(
81    seq: &mut E,
82    slices: impl IntoIterator<Item: AsRef<[T]>>,
83) -> Result<(), E::Error>
84where
85    E: ?Sized + SequenceEncoder,
86    T: Encode<E::Mode>,
87{
88    let cx = seq.cx();
89
90    let mut index = 0usize;
91
92    for slice in slices {
93        for value in slice.as_ref() {
94            cx.enter_sequence_index(index);
95            seq.push(value)?;
96            cx.leave_sequence_index();
97            index = index.wrapping_add(1);
98        }
99    }
100
101    Ok(())
102}