1#![allow(dead_code)]
2use crate::iterators::SliceIterator;
3use binary_merge::{MergeOperation, MergeState};
4use core::{fmt, fmt::Debug};
5use inplace_vec_builder::{InPlaceSmallVecBuilder, InPlaceVecBuilder};
6use smallvec::{Array, SmallVec};
7use std::marker::PhantomData;
8
9pub(crate) trait MergeStateMut: MergeState {
11 fn advance_a(&mut self, n: usize, take: bool) -> bool;
13 fn advance_b(&mut self, n: usize, take: bool) -> bool;
15}
16
17pub(crate) trait MutateInput: MergeStateMut {
18 fn source_slices_mut(&mut self) -> (&mut [Self::A], &[Self::B]);
19}
20
21pub(crate) struct InPlaceMergeState<
22 'a,
23 A: Array,
24 B: Array,
25 C: Converter<B::Item, A::Item> = NoConverter,
26> {
27 pub a: InPlaceSmallVecBuilder<'a, A>,
28 pub b: smallvec::IntoIter<B>,
29 _c: PhantomData<C>,
30}
31
32impl<'a, A: Array, B: Array, C: Converter<B::Item, A::Item>> InPlaceMergeState<'a, A, B, C> {
33 fn new(a: &'a mut SmallVec<A>, b: SmallVec<B>) -> Self {
34 Self {
35 a: a.into(),
36 b: b.into_iter(),
37 _c: PhantomData,
38 }
39 }
40}
41
42impl<'a, A: Array, B: Array, C: Converter<B::Item, A::Item>> MergeState
43 for InPlaceMergeState<'a, A, B, C>
44{
45 type A = A::Item;
46 type B = B::Item;
47 fn a_slice(&self) -> &[A::Item] {
48 self.a.source_slice()
49 }
50 fn b_slice(&self) -> &[B::Item] {
51 self.b.as_slice()
52 }
53}
54
55impl<'a, A: Array, B: Array, C: Converter<B::Item, A::Item>> MergeStateMut
56 for InPlaceMergeState<'a, A, B, C>
57{
58 fn advance_a(&mut self, n: usize, take: bool) -> bool {
59 self.a.consume(n, take);
60 true
61 }
62 fn advance_b(&mut self, n: usize, take: bool) -> bool {
63 if take {
64 self.a.extend_from_iter((&mut self.b).map(C::convert), n);
65 } else {
66 for _ in 0..n {
67 let _ = self.b.next();
68 }
69 }
70 true
71 }
72}
73
74impl<'a, A: Array, B: Array, C: Converter<B::Item, A::Item>> InPlaceMergeState<'a, A, B, C> {
75 pub fn merge<O: MergeOperation<Self>>(a: &'a mut SmallVec<A>, b: SmallVec<B>, o: O, _c: C) {
76 let mut state = Self::new(a, b);
77 o.merge(&mut state);
78 }
79}
80
81pub(crate) struct InPlaceSmallVecMergeStateRef<
83 'a,
84 A: Array,
85 B,
86 C: Converter<&'a B, A::Item> = NoConverter,
87> {
88 pub(crate) a: InPlaceSmallVecBuilder<'a, A>,
89 pub(crate) b: SliceIterator<'a, B>,
90 _c: PhantomData<C>,
91}
92
93impl<'a, A: Array, B, C: Converter<&'a B, A::Item>> InPlaceSmallVecMergeStateRef<'a, A, B, C> {
94 fn new(a: &'a mut SmallVec<A>, b: &'a impl AsRef<[B]>) -> Self {
95 Self {
96 a: a.into(),
97 b: SliceIterator(b.as_ref()),
98 _c: PhantomData,
99 }
100 }
101}
102
103impl<'a, A: Array, B, C: Converter<&'a B, A::Item>> MergeState
104 for InPlaceSmallVecMergeStateRef<'a, A, B, C>
105{
106 type A = A::Item;
107 type B = B;
108 fn a_slice(&self) -> &[A::Item] {
109 self.a.source_slice()
110 }
111 fn b_slice(&self) -> &[B] {
112 self.b.as_slice()
113 }
114}
115
116impl<'a, A: Array, B, C: Converter<&'a B, A::Item>> MergeStateMut
117 for InPlaceSmallVecMergeStateRef<'a, A, B, C>
118where
119 A::Item: Clone,
120{
121 fn advance_a(&mut self, n: usize, take: bool) -> bool {
122 self.a.consume(n, take);
123 true
124 }
125 fn advance_b(&mut self, n: usize, take: bool) -> bool {
126 if take {
127 self.a.extend_from_iter((&mut self.b).map(C::convert), n);
128 } else {
129 for _ in 0..n {
130 let _ = self.b.next();
131 }
132 }
133 true
134 }
135}
136
137impl<'a, A, B, C: Converter<&'a B, A::Item>> MutateInput
138 for InPlaceSmallVecMergeStateRef<'a, A, B, C>
139where
140 A: Array,
141 A::Item: Clone,
142{
143 fn source_slices_mut(&mut self) -> (&mut [Self::A], &[Self::B]) {
144 (self.a.source_slice_mut(), self.b.as_slice())
145 }
146}
147
148impl<'a, A: Array, B: 'a, C: Converter<&'a B, A::Item>> InPlaceSmallVecMergeStateRef<'a, A, B, C> {
149 pub fn merge<O: MergeOperation<Self>>(
150 a: &'a mut SmallVec<A>,
151 b: &'a impl AsRef<[B]>,
152 o: O,
153 _: C,
154 ) {
155 let mut state = Self::new(a, b);
156 o.merge(&mut state);
157 }
158}
159
160pub(crate) struct InPlaceVecMergeStateRef<'a, A, B, C: Converter<&'a B, A> = NoConverter> {
162 pub(crate) a: InPlaceVecBuilder<'a, A>,
163 pub(crate) b: SliceIterator<'a, B>,
164 _c: PhantomData<C>,
165}
166
167impl<'a, A, B, C: Converter<&'a B, A>> InPlaceVecMergeStateRef<'a, A, B, C> {
168 fn new(a: &'a mut Vec<A>, b: &'a impl AsRef<[B]>) -> Self {
169 Self {
170 a: a.into(),
171 b: SliceIterator(b.as_ref()),
172 _c: PhantomData,
173 }
174 }
175}
176
177impl<'a, A, B, C: Converter<&'a B, A>> MergeState for InPlaceVecMergeStateRef<'a, A, B, C> {
178 type A = A;
179 type B = B;
180 fn a_slice(&self) -> &[A] {
181 self.a.source_slice()
182 }
183 fn b_slice(&self) -> &[B] {
184 self.b.as_slice()
185 }
186}
187
188impl<'a, A, B, C: Converter<&'a B, A>> MergeStateMut for InPlaceVecMergeStateRef<'a, A, B, C>
189where
190 A: Clone,
191{
192 fn advance_a(&mut self, n: usize, take: bool) -> bool {
193 self.a.consume(n, take);
194 true
195 }
196 fn advance_b(&mut self, n: usize, take: bool) -> bool {
197 if take {
198 self.a.extend_from_iter((&mut self.b).map(C::convert), n);
199 } else {
200 for _ in 0..n {
201 let _ = self.b.next();
202 }
203 }
204 true
205 }
206}
207
208impl<'a, A, B, C: Converter<&'a B, A>> MutateInput for InPlaceVecMergeStateRef<'a, A, B, C>
209where
210 A: Clone,
211{
212 fn source_slices_mut(&mut self) -> (&mut [Self::A], &[Self::B]) {
213 (self.a.source_slice_mut(), self.b.as_slice())
214 }
215}
216
217impl<'a, A, B: 'a, C: Converter<&'a B, A>> InPlaceVecMergeStateRef<'a, A, B, C> {
218 pub fn merge<O: MergeOperation<Self>>(a: &'a mut Vec<A>, b: &'a impl AsRef<[B]>, o: O, _: C) {
219 let mut state = Self::new(a, b);
220 o.merge(&mut state);
221 }
222}
223
224pub(crate) struct BoolOpMergeState<'a, A, B> {
226 a: SliceIterator<'a, A>,
227 b: SliceIterator<'a, B>,
228 r: bool,
229}
230
231impl<'a, A: Debug, B: Debug> Debug for BoolOpMergeState<'a, A, B> {
232 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
233 write!(
234 f,
235 "a: {:?}, b: {:?} r: {}",
236 self.a_slice(),
237 self.b_slice(),
238 self.r
239 )
240 }
241}
242
243impl<'a, A, B> BoolOpMergeState<'a, A, B> {
244 fn new(a: &'a [A], b: &'a [B]) -> Self {
245 Self {
246 a: SliceIterator(a),
247 b: SliceIterator(b),
248 r: false,
249 }
250 }
251}
252
253impl<'a, A, B> BoolOpMergeState<'a, A, B> {
254 pub fn merge<O: MergeOperation<Self>>(a: &'a [A], b: &'a [B], o: O) -> bool {
255 let mut state = Self::new(a, b);
256 o.merge(&mut state);
257 state.r
258 }
259}
260
261impl<'a, A, B> MergeState for BoolOpMergeState<'a, A, B> {
262 type A = A;
263 type B = B;
264 fn a_slice(&self) -> &[A] {
265 self.a.as_slice()
266 }
267 fn b_slice(&self) -> &[B] {
268 self.b.as_slice()
269 }
270}
271
272impl<'a, A, B> MergeStateMut for BoolOpMergeState<'a, A, B> {
273 fn advance_a(&mut self, n: usize, take: bool) -> bool {
274 if take {
275 self.r = true;
276 false
277 } else {
278 self.a.drop_front(n);
279 true
280 }
281 }
282 fn advance_b(&mut self, n: usize, take: bool) -> bool {
283 if take {
284 self.r = true;
285 false
286 } else {
287 self.b.drop_front(n);
288 true
289 }
290 }
291}
292
293pub trait Converter<A, B> {
294 fn convert(value: A) -> B;
295}
296
297pub struct NoConverter;
299
300impl<A, B> Converter<A, B> for NoConverter {
301 fn convert(_: A) -> B {
302 panic!("conversion not possible")
303 }
304}
305
306pub struct CloneConverter;
308
309impl<A: Clone> Converter<&A, A> for CloneConverter {
310 fn convert(value: &A) -> A {
311 value.clone()
312 }
313}
314
315pub struct IdConverter;
317
318impl<A> Converter<A, A> for IdConverter {
319 fn convert(value: A) -> A {
320 value
321 }
322}
323
324pub(crate) struct SmallVecMergeState<'a, A, B, Arr: Array, C: Converter<&'a B, A> = NoConverter> {
326 pub a: SliceIterator<'a, A>,
327 pub b: SliceIterator<'a, B>,
328 pub r: SmallVec<Arr>,
329 _c: PhantomData<C>,
330}
331
332impl<'a, A: Debug, B: Debug, Arr: Array> Debug for SmallVecMergeState<'a, A, B, Arr> {
333 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
334 write!(f, "a: {:?}, b: {:?}", self.a_slice(), self.b_slice(),)
335 }
336}
337
338impl<'a, A, B, Arr: Array, C: Converter<&'a B, A>> SmallVecMergeState<'a, A, B, Arr, C> {
339 fn new(a: &'a [A], b: &'a [B], r: SmallVec<Arr>) -> Self {
340 Self {
341 a: SliceIterator(a),
342 b: SliceIterator(b),
343 r,
344 _c: PhantomData,
345 }
346 }
347
348 pub fn into_vec(self) -> SmallVec<Arr> {
349 self.r
350 }
351
352 pub fn merge<O: MergeOperation<Self>>(a: &'a [A], b: &'a [B], o: O, _c: C) -> SmallVec<Arr> {
353 let t: SmallVec<Arr> = SmallVec::new();
354 let mut state = Self::new(a, b, t);
355 o.merge(&mut state);
356 state.into_vec()
357 }
358}
359
360impl<'a, A, B, Arr: Array, C: Converter<&'a B, A>> MergeState
361 for SmallVecMergeState<'a, A, B, Arr, C>
362{
363 type A = A;
364 type B = B;
365 fn a_slice(&self) -> &[A] {
366 self.a.as_slice()
367 }
368 fn b_slice(&self) -> &[B] {
369 self.b.as_slice()
370 }
371}
372
373impl<'a, A: Clone, B, Arr: Array<Item = A>, C: Converter<&'a B, A>> MergeStateMut
374 for SmallVecMergeState<'a, A, B, Arr, C>
375{
376 fn advance_a(&mut self, n: usize, take: bool) -> bool {
377 if take {
378 self.r.reserve(n);
379 for e in self.a.take_front(n).iter() {
380 self.r.push(e.clone())
381 }
382 } else {
383 self.a.drop_front(n);
384 }
385 true
386 }
387 fn advance_b(&mut self, n: usize, take: bool) -> bool {
388 if take {
389 self.r.reserve(n);
390 for e in self.b.take_front(n).iter() {
391 self.r.push(C::convert(e))
392 }
393 } else {
394 self.b.drop_front(n);
395 }
396 true
397 }
398}
399
400pub(crate) struct VecMergeState<'a, A, B, R, AC, BC> {
402 pub a: SliceIterator<'a, A>,
403 pub b: SliceIterator<'a, B>,
404 pub r: Vec<R>,
405 _c: PhantomData<(AC, BC)>,
406}
407
408impl<'a, A: Debug, B: Debug, R, AC, BC> Debug for VecMergeState<'a, A, B, R, AC, BC> {
409 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
410 write!(f, "a: {:?}, b: {:?}", self.a_slice(), self.b_slice(),)
411 }
412}
413
414impl<'a, A, B, R, AC: Converter<&'a A, R>, BC: Converter<&'a B, R>>
415 VecMergeState<'a, A, B, R, AC, BC>
416{
417 fn new(a: &'a [A], b: &'a [B], r: Vec<R>) -> Self {
418 Self {
419 a: SliceIterator(a),
420 b: SliceIterator(b),
421 r,
422 _c: PhantomData,
423 }
424 }
425
426 fn into_vec(self) -> Vec<R> {
427 self.r
428 }
429
430 pub fn merge<O: MergeOperation<Self>>(
431 a: &'a [A],
432 b: &'a [B],
433 o: O,
434 _ac: AC,
435 _bc: BC,
436 ) -> Vec<R> {
437 let t: Vec<R> = Vec::new();
438 let mut state = Self::new(a, b, t);
439 o.merge(&mut state);
440 state.into_vec()
441 }
442}
443
444impl<'a, A, B, R, AC, BC> MergeState for VecMergeState<'a, A, B, R, AC, BC> {
445 type A = A;
446 type B = B;
447 fn a_slice(&self) -> &[A] {
448 self.a.as_slice()
449 }
450 fn b_slice(&self) -> &[B] {
451 self.b.as_slice()
452 }
453}
454
455impl<'a, A, B, R, AC: Converter<&'a A, R>, BC: Converter<&'a B, R>> MergeStateMut
456 for VecMergeState<'a, A, B, R, AC, BC>
457{
458 fn advance_a(&mut self, n: usize, take: bool) -> bool {
459 if take {
460 self.r.reserve(n);
461 for e in self.a.take_front(n).iter() {
462 self.r.push(AC::convert(e))
463 }
464 } else {
465 self.a.drop_front(n);
466 }
467 true
468 }
469 fn advance_b(&mut self, n: usize, take: bool) -> bool {
470 if take {
471 self.r.reserve(n);
472 for e in self.b.take_front(n).iter() {
473 self.r.push(BC::convert(e))
474 }
475 } else {
476 self.b.drop_front(n);
477 }
478 true
479 }
480}