Coverage Report

Created: 2026-11-11 06:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/range-collections-0.4.6/src/merge_state.rs
Line
Count
Source
1
#![allow(clippy::needless_lifetimes)]
2
use crate::iterators::SliceIterator;
3
use binary_merge::{MergeOperation, MergeState};
4
use core::fmt::Debug;
5
use inplace_vec_builder::InPlaceSmallVecBuilder;
6
use smallvec::{Array, SmallVec};
7
8
/// A typical write part for the merge state
9
pub(crate) trait MergeStateMut: MergeState {
10
    // Consume 1 elements from a and b, will copy from a
11
0
    fn advance_both(&mut self, copy: bool) -> bool {
12
0
        self.advance_a(1, copy) && self.advance_b(1, false)
13
0
    }
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<[u32; 2], [u32; 2]> as range_collections::merge_state::MergeStateMut>::advance_both
Unexecuted instantiation: <range_collections::range_set::VecMergeState<u32, [u32; 2]> as range_collections::merge_state::MergeStateMut>::advance_both
Unexecuted instantiation: <range_collections::range_set::RangeSetBoolOpMergeState<u32> as range_collections::merge_state::MergeStateMut>::advance_both
Unexecuted instantiation: <_ as range_collections::merge_state::MergeStateMut>::advance_both
14
    /// Consume n elements of a, and update ac
15
    fn advance_a(&mut self, n: usize, take: bool) -> bool;
16
    /// Consume n elements of b, and update bc
17
    fn advance_b(&mut self, n: usize, take: bool) -> bool;
18
19
    fn ac(&self) -> bool;
20
21
    fn bc(&self) -> bool;
22
}
23
24
/// An in place merge state where the rhs is an owned smallvec
25
pub(crate) struct InPlaceMergeState<'a, A: Array, B: Array> {
26
    a: InPlaceSmallVecBuilder<'a, A>,
27
    b: smallvec::IntoIter<B>,
28
    ac: bool,
29
    bc: bool,
30
}
31
32
impl<'a, A: Array, B: Array> InPlaceMergeState<'a, A, B> {
33
0
    pub fn new(a: &'a mut SmallVec<A>, b: SmallVec<B>) -> Self {
34
0
        Self {
35
0
            a: a.into(),
36
0
            b: b.into_iter(),
37
0
            ac: false,
38
0
            bc: false,
39
0
        }
40
0
    }
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<[u32; 2], [u32; 2]>>::new
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<_, _>>::new
41
}
42
43
impl<'a, A: Array, B: Array> MergeState for InPlaceMergeState<'a, A, B> {
44
    type A = A::Item;
45
    type B = B::Item;
46
0
    fn a_slice(&self) -> &[A::Item] {
47
0
        self.a.source_slice()
48
0
    }
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<[u32; 2], [u32; 2]> as binary_merge::MergeState>::a_slice
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<_, _> as binary_merge::MergeState>::a_slice
49
0
    fn b_slice(&self) -> &[B::Item] {
50
0
        self.b.as_slice()
51
0
    }
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<[u32; 2], [u32; 2]> as binary_merge::MergeState>::b_slice
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<_, _> as binary_merge::MergeState>::b_slice
52
}
53
54
impl<'a, A: Array> MergeStateMut for InPlaceMergeState<'a, A, A> {
55
    #[inline]
56
0
    fn advance_a(&mut self, n: usize, take: bool) -> bool {
57
0
        self.ac ^= is_odd(n);
58
0
        self.a.consume(n, take);
59
0
        true
60
0
    }
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<[u32; 2], [u32; 2]> as range_collections::merge_state::MergeStateMut>::advance_a
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<_, _> as range_collections::merge_state::MergeStateMut>::advance_a
61
    #[inline]
62
0
    fn advance_b(&mut self, n: usize, take: bool) -> bool {
63
0
        self.bc ^= is_odd(n);
64
0
        if take {
65
0
            self.a.extend_from_iter(&mut self.b, n);
66
0
        } else {
67
0
            for _ in 0..n {
68
0
                let _ = self.b.next();
69
0
            }
70
        }
71
0
        true
72
0
    }
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<[u32; 2], [u32; 2]> as range_collections::merge_state::MergeStateMut>::advance_b
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<_, _> as range_collections::merge_state::MergeStateMut>::advance_b
73
0
    fn ac(&self) -> bool {
74
0
        self.ac
75
0
    }
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<[u32; 2], [u32; 2]> as range_collections::merge_state::MergeStateMut>::ac
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<_, _> as range_collections::merge_state::MergeStateMut>::ac
76
0
    fn bc(&self) -> bool {
77
0
        self.bc
78
0
    }
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<[u32; 2], [u32; 2]> as range_collections::merge_state::MergeStateMut>::bc
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<_, _> as range_collections::merge_state::MergeStateMut>::bc
79
}
80
81
impl<'a, A: Array, B: Array> InPlaceMergeState<'a, A, B> {
82
0
    pub fn merge<O: MergeOperation<Self>>(a: &'a mut SmallVec<A>, b: SmallVec<B>, o: O) {
83
0
        let mut state = Self::new(a, b);
84
0
        o.merge(&mut state);
85
0
    }
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<[u32; 2], [u32; 2]>>::merge::<range_collections::range_set::UnionOp>
Unexecuted instantiation: <range_collections::merge_state::InPlaceMergeState<_, _>>::merge::<_>
86
}
87
88
/// An in place merge state where the rhs is a reference
89
pub(crate) struct InPlaceMergeStateRef<'a, A: Array, B> {
90
    a: InPlaceSmallVecBuilder<'a, A>,
91
    b: SliceIterator<'a, B>,
92
    ac: bool,
93
    bc: bool,
94
}
95
96
impl<'a, A: Array, B> InPlaceMergeStateRef<'a, A, B> {
97
0
    pub fn new(a: &'a mut SmallVec<A>, b: &'a impl AsRef<[B]>) -> Self {
98
0
        Self {
99
0
            a: a.into(),
100
0
            b: SliceIterator(b.as_ref()),
101
0
            ac: false,
102
0
            bc: false,
103
0
        }
104
0
    }
105
}
106
107
impl<'a, A: Array, B> MergeState for InPlaceMergeStateRef<'a, A, B> {
108
    type A = A::Item;
109
    type B = B;
110
0
    fn a_slice(&self) -> &[A::Item] {
111
0
        self.a.source_slice()
112
0
    }
113
0
    fn b_slice(&self) -> &[B] {
114
0
        self.b.as_slice()
115
0
    }
116
}
117
118
impl<'a, A: Array> MergeStateMut for InPlaceMergeStateRef<'a, A, A::Item>
119
where
120
    A::Item: Clone,
121
{
122
    #[inline]
123
0
    fn advance_a(&mut self, n: usize, take: bool) -> bool {
124
0
        self.ac ^= is_odd(n);
125
0
        self.a.consume(n, take);
126
0
        true
127
0
    }
128
    #[inline]
129
0
    fn advance_b(&mut self, n: usize, take: bool) -> bool {
130
0
        self.bc ^= is_odd(n);
131
0
        if take {
132
0
            self.a.extend_from_iter((&mut self.b).cloned(), n);
133
0
        } else {
134
0
            for _ in 0..n {
135
0
                let _ = self.b.next();
136
0
            }
137
        }
138
0
        true
139
0
    }
140
0
    fn ac(&self) -> bool {
141
0
        self.ac
142
0
    }
143
0
    fn bc(&self) -> bool {
144
0
        self.bc
145
0
    }
146
}
147
148
impl<'a, A: Array, B: 'a> InPlaceMergeStateRef<'a, A, B> {
149
0
    pub fn merge<O: MergeOperation<Self>>(a: &'a mut SmallVec<A>, b: &'a impl AsRef<[B]>, o: O) {
150
0
        let mut state = Self::new(a, b);
151
0
        o.merge(&mut state);
152
0
    }
153
}
154
155
/// A merge state where we only track if elements have been produced, and abort as soon as the first element is produced
156
pub(crate) struct BoolOpMergeState<'a, A, B> {
157
    a: SliceIterator<'a, A>,
158
    b: SliceIterator<'a, B>,
159
    ac: bool,
160
    bc: bool,
161
    r: bool,
162
}
163
164
impl<'a, A: Debug, B: Debug> Debug for BoolOpMergeState<'a, A, B> {
165
0
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
166
0
        write!(
167
0
            f,
168
0
            "a: {:?}, b: {:?} r: {}",
169
0
            self.a_slice(),
170
0
            self.b_slice(),
171
            self.r
172
        )
173
0
    }
174
}
175
176
impl<'a, A, B> BoolOpMergeState<'a, A, B> {
177
0
    pub fn new(a: &'a [A], b: &'a [B]) -> Self {
178
0
        Self {
179
0
            a: SliceIterator(a),
180
0
            b: SliceIterator(b),
181
0
            ac: false,
182
0
            bc: false,
183
0
            r: false,
184
0
        }
185
0
    }
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<u32, u32>>::new
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<_, _>>::new
186
187
0
    pub fn result(self) -> bool {
188
0
        self.r
189
0
    }
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<u32, u32>>::result
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<_, _>>::result
190
}
191
192
impl<'a, A, B> BoolOpMergeState<'a, A, B> {
193
0
    pub fn merge<O: MergeOperation<Self>>(a: &'a [A], b: &'a [B], o: O) -> bool {
194
0
        let mut state = Self::new(a, b);
195
0
        o.merge(&mut state);
196
0
        state.r
197
0
    }
198
}
199
200
impl<'a, A, B> MergeState for BoolOpMergeState<'a, A, B> {
201
    type A = A;
202
    type B = B;
203
0
    fn a_slice(&self) -> &[A] {
204
0
        self.a.as_slice()
205
0
    }
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<u32, u32> as binary_merge::MergeState>::a_slice
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<_, _> as binary_merge::MergeState>::a_slice
206
0
    fn b_slice(&self) -> &[B] {
207
0
        self.b.as_slice()
208
0
    }
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<u32, u32> as binary_merge::MergeState>::b_slice
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<_, _> as binary_merge::MergeState>::b_slice
209
}
210
211
impl<'a, A, B> MergeStateMut for BoolOpMergeState<'a, A, B> {
212
0
    fn advance_a(&mut self, n: usize, take: bool) -> bool {
213
0
        self.ac ^= is_odd(n);
214
0
        if take {
215
0
            self.r = true;
216
0
            false
217
        } else {
218
0
            self.a.drop_front(n);
219
0
            true
220
        }
221
0
    }
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<u32, u32> as range_collections::merge_state::MergeStateMut>::advance_a
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<_, _> as range_collections::merge_state::MergeStateMut>::advance_a
222
223
0
    fn advance_b(&mut self, n: usize, take: bool) -> bool {
224
0
        self.bc ^= is_odd(n);
225
0
        if take {
226
0
            self.r = true;
227
0
            false
228
        } else {
229
0
            self.b.drop_front(n);
230
0
            true
231
        }
232
0
    }
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<u32, u32> as range_collections::merge_state::MergeStateMut>::advance_b
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<_, _> as range_collections::merge_state::MergeStateMut>::advance_b
233
0
    fn ac(&self) -> bool {
234
0
        self.ac
235
0
    }
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<u32, u32> as range_collections::merge_state::MergeStateMut>::ac
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<_, _> as range_collections::merge_state::MergeStateMut>::ac
236
0
    fn bc(&self) -> bool {
237
0
        self.bc
238
0
    }
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<u32, u32> as range_collections::merge_state::MergeStateMut>::bc
Unexecuted instantiation: <range_collections::merge_state::BoolOpMergeState<_, _> as range_collections::merge_state::MergeStateMut>::bc
239
}
240
241
/// A merge state where we build into a new vector
242
pub(crate) struct SmallVecMergeState<'a, A, B, Arr: Array> {
243
    a: SliceIterator<'a, A>,
244
    b: SliceIterator<'a, B>,
245
    ac: bool,
246
    bc: bool,
247
    r: SmallVec<Arr>,
248
}
249
250
impl<'a, A: Debug, B: Debug, Arr: Array> Debug for SmallVecMergeState<'a, A, B, Arr> {
251
0
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
252
0
        write!(f, "a: {:?}, b: {:?}", self.a_slice(), self.b_slice(),)
253
0
    }
254
}
255
256
impl<'a, A, B, Arr: Array> SmallVecMergeState<'a, A, B, Arr> {
257
0
    pub fn new(a: &'a [A], b: &'a [B], r: SmallVec<Arr>) -> Self {
258
0
        Self {
259
0
            a: SliceIterator(a),
260
0
            b: SliceIterator(b),
261
0
            ac: false,
262
0
            bc: false,
263
0
            r,
264
0
        }
265
0
    }
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<u32, u32, [u32; 2]>>::new
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<_, _, _>>::new
266
267
0
    pub fn result(self) -> SmallVec<Arr> {
268
0
        self.r
269
0
    }
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<u32, u32, [u32; 2]>>::result
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<_, _, _>>::result
270
271
0
    pub fn merge<O: MergeOperation<Self>>(a: &'a [A], b: &'a [B], o: O) -> SmallVec<Arr> {
272
0
        let t: SmallVec<Arr> = SmallVec::new();
273
0
        let mut state = Self::new(a, b, t);
274
0
        o.merge(&mut state);
275
0
        state.result()
276
0
    }
277
}
278
279
impl<'a, A, B, Arr: Array> MergeState for SmallVecMergeState<'a, A, B, Arr> {
280
    type A = A;
281
    type B = B;
282
0
    fn a_slice(&self) -> &[A] {
283
0
        self.a.as_slice()
284
0
    }
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<u32, u32, [u32; 2]> as binary_merge::MergeState>::a_slice
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<_, _, _> as binary_merge::MergeState>::a_slice
285
0
    fn b_slice(&self) -> &[B] {
286
0
        self.b.as_slice()
287
0
    }
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<u32, u32, [u32; 2]> as binary_merge::MergeState>::b_slice
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<_, _, _> as binary_merge::MergeState>::b_slice
288
}
289
290
impl<'a, T: Clone, Arr: Array<Item = T>> MergeStateMut for SmallVecMergeState<'a, T, T, Arr> {
291
0
    fn advance_a(&mut self, n: usize, take: bool) -> bool {
292
0
        self.ac ^= is_odd(n);
293
0
        if take {
294
0
            self.r.reserve(n);
295
0
            for e in self.a.take_front(n).iter() {
296
0
                self.r.push(e.clone())
297
            }
298
0
        } else {
299
0
            self.a.drop_front(n);
300
0
        }
301
0
        true
302
0
    }
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<u32, u32, [u32; 2]> as range_collections::merge_state::MergeStateMut>::advance_a
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<_, _, _> as range_collections::merge_state::MergeStateMut>::advance_a
303
304
0
    fn advance_b(&mut self, n: usize, take: bool) -> bool {
305
0
        self.bc ^= is_odd(n);
306
0
        if take {
307
0
            self.r.reserve(n);
308
0
            for e in self.b.take_front(n).iter() {
309
0
                self.r.push(e.clone())
310
            }
311
0
        } else {
312
0
            self.b.drop_front(n);
313
0
        }
314
0
        true
315
0
    }
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<u32, u32, [u32; 2]> as range_collections::merge_state::MergeStateMut>::advance_b
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<_, _, _> as range_collections::merge_state::MergeStateMut>::advance_b
316
0
    fn ac(&self) -> bool {
317
0
        self.ac
318
0
    }
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<u32, u32, [u32; 2]> as range_collections::merge_state::MergeStateMut>::ac
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<_, _, _> as range_collections::merge_state::MergeStateMut>::ac
319
0
    fn bc(&self) -> bool {
320
0
        self.bc
321
0
    }
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<u32, u32, [u32; 2]> as range_collections::merge_state::MergeStateMut>::bc
Unexecuted instantiation: <range_collections::merge_state::SmallVecMergeState<_, _, _> as range_collections::merge_state::MergeStateMut>::bc
322
}
323
324
#[inline]
325
0
fn is_odd(x: usize) -> bool {
326
0
    (x & 1) != 0
327
0
}
Unexecuted instantiation: range_collections::merge_state::is_odd
Unexecuted instantiation: range_collections::merge_state::is_odd