Coverage Report

Created: 2026-09-19 07:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/revision-0.30.0/src/implementations/walk.rs
Line
Count
Source
1
//! [`WalkRevisioned`] implementations for primitives, collections, wrappers,
2
//! and feature-gated types. Mirror layout of [`super::skip`].
3
4
#[cfg(feature = "specialised-vectors")]
5
use std::any::TypeId;
6
use std::borrow::Cow;
7
use std::cmp::Reverse;
8
use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet};
9
use std::hash::{BuildHasher, Hash};
10
use std::num::Wrapping;
11
use std::ops::{Bound, Range};
12
use std::path::PathBuf;
13
use std::sync::Arc;
14
use std::time::SystemTime;
15
16
use crate::slice_reader::BorrowedReader;
17
use crate::walk::{LeafWalker, MapWalker, OptionWalker, ResultWalker, SeqWalker};
18
use crate::{Error, Revisioned, WalkRevisioned};
19
20
/// Whether `Vec<T>` uses the compact bulk layout from `try_specialized!` in
21
/// `implementations/vecs.rs` for the given `T`. Only `Vec<T>` selects that
22
/// path; sets and heaps always use per-element framing, so this check is
23
/// scoped to [`Vec<T>::walk_revisioned`] and not the generic [`SeqWalker`].
24
#[cfg(feature = "specialised-vectors")]
25
#[inline]
26
0
fn vec_uses_bulk_encoding<T: 'static>() -> bool {
27
0
  let id = TypeId::of::<T>();
28
  macro_rules! bulk_primitive {
29
    ($($ty:ty),* $(,)?) => {{
30
      $(if id == TypeId::of::<$ty>() {
31
        return true;
32
      })*
33
    }};
34
  }
35
0
  bulk_primitive!(bool, u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, f32, f64);
36
  #[cfg(feature = "uuid")]
37
0
  if id == TypeId::of::<uuid::Uuid>() {
38
0
    return true;
39
0
  }
40
  #[cfg(feature = "rust_decimal")]
41
0
  if id == TypeId::of::<rust_decimal::Decimal>() {
42
0
    return true;
43
0
  }
44
0
  false
45
0
}
46
47
#[cfg(not(feature = "specialised-vectors"))]
48
#[inline]
49
fn vec_uses_bulk_encoding<T: 'static>() -> bool {
50
  let _ = std::marker::PhantomData::<T>;
51
  false
52
}
53
54
// -----------------------------------------------------------------------------
55
// Primitive leaves
56
// -----------------------------------------------------------------------------
57
58
macro_rules! leaf_walk {
59
  ($($t:ty),* $(,)?) => {$(
60
    impl WalkRevisioned for $t {
61
      type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, $t, R>;
62
63
      #[inline]
64
0
      fn walk_revisioned<'r, R: BorrowedReader>(
65
0
        reader: &'r mut R,
66
0
      ) -> Result<Self::Walker<'r, R>, Error> {
67
0
        Ok(LeafWalker::new(reader))
68
0
      }
Unexecuted instantiation: <bool as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <u8 as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <i8 as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <u16 as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <i16 as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <u32 as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <i32 as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <u64 as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <i64 as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <u128 as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <i128 as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <usize as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <isize as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <f32 as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <f64 as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <char as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <alloc::string::String as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <core::time::Duration as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <std::path::PathBuf as revision::walk::WalkRevisioned>::walk_revisioned::<_>
69
    }
70
  )*};
71
}
72
73
leaf_walk!(
74
  bool,
75
  u8,
76
  i8,
77
  u16,
78
  i16,
79
  u32,
80
  i32,
81
  u64,
82
  i64,
83
  u128,
84
  i128,
85
  usize,
86
  isize,
87
  f32,
88
  f64,
89
  char,
90
  String,
91
  std::time::Duration,
92
  PathBuf,
93
);
94
95
impl WalkRevisioned for SystemTime {
96
  type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, SystemTime, R>;
97
98
  #[inline]
99
0
  fn walk_revisioned<'r, R: BorrowedReader>(
100
0
    reader: &'r mut R,
101
0
  ) -> Result<Self::Walker<'r, R>, Error> {
102
0
    Ok(LeafWalker::new(reader))
103
0
  }
104
}
105
106
// -----------------------------------------------------------------------------
107
// Range<T>
108
// -----------------------------------------------------------------------------
109
110
impl<T: WalkRevisioned> WalkRevisioned for Range<T> {
111
  type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, Range<T>, R>;
112
113
  #[inline]
114
0
  fn walk_revisioned<'r, R: BorrowedReader>(
115
0
    reader: &'r mut R,
116
0
  ) -> Result<Self::Walker<'r, R>, Error> {
117
0
    Ok(LeafWalker::new(reader))
118
0
  }
119
}
120
121
// -----------------------------------------------------------------------------
122
// Tuples and arrays — treated as opaque leaves; deserialise/skip is the
123
// natural granularity. Future extensions could expose per-element walkers.
124
// -----------------------------------------------------------------------------
125
126
macro_rules! tuple_walk_impl {
127
  ($($n:ident),* $(,)?) => {
128
    impl<$($n,)*> WalkRevisioned for ($($n,)*)
129
    where $($n: Revisioned,)*
130
    {
131
      type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, Self, R>;
132
133
      #[inline]
134
0
      fn walk_revisioned<'r, R: BorrowedReader>(
135
0
        reader: &'r mut R,
136
0
      ) -> Result<Self::Walker<'r, R>, Error> {
137
0
        Ok(LeafWalker::new(reader))
138
0
      }
Unexecuted instantiation: <(_, _) as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <(_, _, _) as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <(_, _, _, _) as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <(_, _, _, _, _) as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <(_, _, _, _, _, _) as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <(_,) as revision::walk::WalkRevisioned>::walk_revisioned::<_>
139
    }
140
  };
141
}
142
143
tuple_walk_impl! { A }
144
tuple_walk_impl! { A, B }
145
tuple_walk_impl! { A, B, C }
146
tuple_walk_impl! { A, B, C, D }
147
tuple_walk_impl! { A, B, C, D, E }
148
tuple_walk_impl! { A, B, C, D, E, F }
149
150
macro_rules! array_walk_sizes {
151
  ($($N:literal)+) => {$(
152
    impl<T> WalkRevisioned for [T; $N]
153
    where
154
      T: Revisioned + Copy + Default,
155
    {
156
      type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, Self, R>;
157
158
      #[inline]
159
0
      fn walk_revisioned<'r, R: BorrowedReader>(
160
0
        reader: &'r mut R,
161
0
      ) -> Result<Self::Walker<'r, R>, Error> {
162
0
        Ok(LeafWalker::new(reader))
163
0
      }
Unexecuted instantiation: <[_; 22] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 23] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 24] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 25] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 26] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 27] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 28] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 29] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 30] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 31] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 32] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 1] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 2] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 3] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 4] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 5] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 6] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 7] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 8] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 9] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 10] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 11] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 12] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 13] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 14] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 15] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 16] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 17] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 18] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 19] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 20] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <[_; 21] as revision::walk::WalkRevisioned>::walk_revisioned::<_>
164
    }
165
  )+};
166
}
167
168
array_walk_sizes! {
169
   1  2  3  4  5  6  7  8  9 10
170
  11 12 13 14 15 16 17 18 19 20
171
  21 22 23 24 25 26 27 28 29 30
172
  31 32
173
}
174
175
// -----------------------------------------------------------------------------
176
// Option<T>
177
// -----------------------------------------------------------------------------
178
179
impl<T> WalkRevisioned for Option<T>
180
where
181
  T: Revisioned,
182
{
183
  type Walker<'r, R: BorrowedReader + 'r> = OptionWalker<'r, T, R>;
184
185
  #[inline]
186
0
  fn walk_revisioned<'r, R: BorrowedReader>(
187
0
    reader: &'r mut R,
188
0
  ) -> Result<Self::Walker<'r, R>, Error> {
189
0
    OptionWalker::new(reader)
190
0
  }
191
}
192
193
// -----------------------------------------------------------------------------
194
// Result<T, E>
195
// -----------------------------------------------------------------------------
196
197
impl<T, E> WalkRevisioned for Result<T, E>
198
where
199
  T: Revisioned,
200
  E: Revisioned,
201
{
202
  type Walker<'r, R: BorrowedReader + 'r> = ResultWalker<'r, T, E, R>;
203
204
  #[inline]
205
0
  fn walk_revisioned<'r, R: BorrowedReader>(
206
0
    reader: &'r mut R,
207
0
  ) -> Result<Self::Walker<'r, R>, Error> {
208
0
    ResultWalker::new(reader)
209
0
  }
210
}
211
212
// -----------------------------------------------------------------------------
213
// Bound<T> — opaque (tag + optional payload). Surface as a leaf for v1; users
214
// who need to inspect the variant can decode/skip and then post-process.
215
// -----------------------------------------------------------------------------
216
217
impl<T> WalkRevisioned for Bound<T>
218
where
219
  T: Revisioned,
220
{
221
  type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, Bound<T>, R>;
222
223
  #[inline]
224
0
  fn walk_revisioned<'r, R: BorrowedReader>(
225
0
    reader: &'r mut R,
226
0
  ) -> Result<Self::Walker<'r, R>, Error> {
227
0
    Ok(LeafWalker::new(reader))
228
0
  }
229
}
230
231
// -----------------------------------------------------------------------------
232
// Vec<T> — sequence with length prefix
233
// -----------------------------------------------------------------------------
234
235
impl<T> WalkRevisioned for Vec<T>
236
where
237
  T: Revisioned + 'static,
238
{
239
  type Walker<'r, R: BorrowedReader + 'r> = SeqWalker<'r, T, R>;
240
241
  #[inline]
242
0
  fn walk_revisioned<'r, R: BorrowedReader>(
243
0
    reader: &'r mut R,
244
0
  ) -> Result<Self::Walker<'r, R>, Error> {
245
0
    if vec_uses_bulk_encoding::<T>() {
246
0
      return Err(Error::Deserialize(
247
0
        "Vec<T>: cannot walk Vec whose element type uses specialised bulk encoding \
248
0
         when the `specialised-vectors` feature is enabled; use DeserializeRevisioned \
249
0
         or SkipRevisioned instead."
250
0
          .into(),
251
0
      ));
252
0
    }
253
0
    SeqWalker::new(reader)
254
0
  }
255
}
256
257
// -----------------------------------------------------------------------------
258
// HashSet<T>, BTreeSet<T>, BinaryHeap<T>
259
// -----------------------------------------------------------------------------
260
261
impl<T, S> WalkRevisioned for HashSet<T, S>
262
where
263
  T: Revisioned + Eq + Hash,
264
  S: BuildHasher + Default,
265
{
266
  type Walker<'r, R: BorrowedReader + 'r> = SeqWalker<'r, T, R>;
267
268
  #[inline]
269
0
  fn walk_revisioned<'r, R: BorrowedReader>(
270
0
    reader: &'r mut R,
271
0
  ) -> Result<Self::Walker<'r, R>, Error> {
272
0
    SeqWalker::new(reader)
273
0
  }
274
}
275
276
impl<T> WalkRevisioned for BTreeSet<T>
277
where
278
  T: Revisioned + Ord,
279
{
280
  type Walker<'r, R: BorrowedReader + 'r> = SeqWalker<'r, T, R>;
281
282
  #[inline]
283
0
  fn walk_revisioned<'r, R: BorrowedReader>(
284
0
    reader: &'r mut R,
285
0
  ) -> Result<Self::Walker<'r, R>, Error> {
286
0
    SeqWalker::new(reader)
287
0
  }
288
}
289
290
impl<T> WalkRevisioned for BinaryHeap<T>
291
where
292
  T: Revisioned + Ord,
293
{
294
  type Walker<'r, R: BorrowedReader + 'r> = SeqWalker<'r, T, R>;
295
296
  #[inline]
297
0
  fn walk_revisioned<'r, R: BorrowedReader>(
298
0
    reader: &'r mut R,
299
0
  ) -> Result<Self::Walker<'r, R>, Error> {
300
0
    SeqWalker::new(reader)
301
0
  }
302
}
303
304
// -----------------------------------------------------------------------------
305
// HashMap<K, V>, BTreeMap<K, V>
306
// -----------------------------------------------------------------------------
307
308
impl<K, V, S> WalkRevisioned for HashMap<K, V, S>
309
where
310
  K: Revisioned + Eq + Hash,
311
  V: Revisioned,
312
  S: BuildHasher + Default,
313
{
314
  type Walker<'r, R: BorrowedReader + 'r> = MapWalker<'r, K, V, R>;
315
316
  #[inline]
317
0
  fn walk_revisioned<'r, R: BorrowedReader>(
318
0
    reader: &'r mut R,
319
0
  ) -> Result<Self::Walker<'r, R>, Error> {
320
0
    MapWalker::new(reader)
321
0
  }
322
}
323
324
impl<K, V> WalkRevisioned for BTreeMap<K, V>
325
where
326
  K: Revisioned + Ord,
327
  V: Revisioned,
328
{
329
  type Walker<'r, R: BorrowedReader + 'r> = MapWalker<'r, K, V, R>;
330
331
  #[inline]
332
0
  fn walk_revisioned<'r, R: BorrowedReader>(
333
0
    reader: &'r mut R,
334
0
  ) -> Result<Self::Walker<'r, R>, Error> {
335
0
    MapWalker::new(reader)
336
0
  }
337
}
338
339
// -----------------------------------------------------------------------------
340
// Wrapping pointers/wrappers — transparent, defer to the inner walker.
341
// -----------------------------------------------------------------------------
342
343
impl<T> WalkRevisioned for Box<T>
344
where
345
  T: WalkRevisioned,
346
{
347
  type Walker<'r, R: BorrowedReader + 'r> = T::Walker<'r, R>;
348
349
  #[inline]
350
0
  fn walk_revisioned<'r, R: BorrowedReader>(
351
0
    reader: &'r mut R,
352
0
  ) -> Result<Self::Walker<'r, R>, Error> {
353
0
    T::walk_revisioned(reader)
354
0
  }
355
}
356
357
impl<T> WalkRevisioned for Arc<T>
358
where
359
  T: WalkRevisioned,
360
{
361
  type Walker<'r, R: BorrowedReader + 'r> = T::Walker<'r, R>;
362
363
  #[inline]
364
0
  fn walk_revisioned<'r, R: BorrowedReader>(
365
0
    reader: &'r mut R,
366
0
  ) -> Result<Self::Walker<'r, R>, Error> {
367
0
    T::walk_revisioned(reader)
368
0
  }
369
}
370
371
impl WalkRevisioned for Arc<str> {
372
  type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, Arc<str>, R>;
373
374
  #[inline]
375
0
  fn walk_revisioned<'r, R: BorrowedReader>(
376
0
    reader: &'r mut R,
377
0
  ) -> Result<Self::Walker<'r, R>, Error> {
378
0
    Ok(LeafWalker::new(reader))
379
0
  }
380
}
381
382
impl WalkRevisioned for Box<str> {
383
  type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, Box<str>, R>;
384
385
  #[inline]
386
0
  fn walk_revisioned<'r, R: BorrowedReader>(
387
0
    reader: &'r mut R,
388
0
  ) -> Result<Self::Walker<'r, R>, Error> {
389
0
    Ok(LeafWalker::new(reader))
390
0
  }
391
}
392
393
impl<T> WalkRevisioned for Wrapping<T>
394
where
395
  T: WalkRevisioned,
396
{
397
  type Walker<'r, R: BorrowedReader + 'r> = T::Walker<'r, R>;
398
399
  #[inline]
400
0
  fn walk_revisioned<'r, R: BorrowedReader>(
401
0
    reader: &'r mut R,
402
0
  ) -> Result<Self::Walker<'r, R>, Error> {
403
0
    T::walk_revisioned(reader)
404
0
  }
405
}
406
407
impl<T> WalkRevisioned for Reverse<T>
408
where
409
  T: WalkRevisioned,
410
{
411
  type Walker<'r, R: BorrowedReader + 'r> = T::Walker<'r, R>;
412
413
  #[inline]
414
0
  fn walk_revisioned<'r, R: BorrowedReader>(
415
0
    reader: &'r mut R,
416
0
  ) -> Result<Self::Walker<'r, R>, Error> {
417
0
    T::walk_revisioned(reader)
418
0
  }
419
}
420
421
/// `Cow<'_, T>` is treated as opaque by the walker. The walker is a
422
/// [`LeafWalker`] over `T::Owned` rather than a sub-walker into `T::Owned`'s
423
/// shape, so `decode()` returns `T::Owned` (e.g. `String` for
424
/// `Cow<'_, str>`), not a `Cow`. Use [`DeserializeRevisioned`] if you need
425
/// a `Cow` back, or call `T::Owned::walk_revisioned` directly to descend
426
/// into the inner shape.
427
///
428
/// [`DeserializeRevisioned`]: crate::DeserializeRevisioned
429
impl<T> WalkRevisioned for Cow<'_, T>
430
where
431
  T: ToOwned + Revisioned,
432
  T::Owned: WalkRevisioned,
433
{
434
  type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, T::Owned, R>;
435
436
  #[inline]
437
0
  fn walk_revisioned<'r, R: BorrowedReader>(
438
0
    reader: &'r mut R,
439
0
  ) -> Result<Self::Walker<'r, R>, Error> {
440
0
    Ok(LeafWalker::new(reader))
441
0
  }
442
}
443
444
// -----------------------------------------------------------------------------
445
// Feature-gated leaves
446
// -----------------------------------------------------------------------------
447
448
#[cfg(feature = "ordered-float")]
449
mod notnan_walk {
450
  use super::*;
451
  use ordered_float::{FloatCore, NotNan};
452
453
  impl<T> WalkRevisioned for NotNan<T>
454
  where
455
    T: WalkRevisioned + FloatCore,
456
  {
457
    type Walker<'r, R: BorrowedReader + 'r> = T::Walker<'r, R>;
458
459
    #[inline]
460
    fn walk_revisioned<'r, R: BorrowedReader>(
461
      reader: &'r mut R,
462
    ) -> Result<Self::Walker<'r, R>, Error> {
463
      T::walk_revisioned(reader)
464
    }
465
  }
466
}
467
468
#[cfg(feature = "rust_decimal")]
469
mod decimal_walk {
470
  use super::*;
471
  use rust_decimal::Decimal;
472
473
  impl WalkRevisioned for Decimal {
474
    type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, Decimal, R>;
475
476
    #[inline]
477
0
    fn walk_revisioned<'r, R: BorrowedReader>(
478
0
      reader: &'r mut R,
479
0
    ) -> Result<Self::Walker<'r, R>, Error> {
480
0
      Ok(LeafWalker::new(reader))
481
0
    }
482
  }
483
}
484
485
#[cfg(feature = "uuid")]
486
mod uuid_walk {
487
  use super::*;
488
  use uuid::Uuid;
489
490
  impl WalkRevisioned for Uuid {
491
    type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, Uuid, R>;
492
493
    #[inline]
494
0
    fn walk_revisioned<'r, R: BorrowedReader>(
495
0
      reader: &'r mut R,
496
0
    ) -> Result<Self::Walker<'r, R>, Error> {
497
0
      Ok(LeafWalker::new(reader))
498
0
    }
499
  }
500
}
501
502
#[cfg(feature = "regex")]
503
mod regex_walk {
504
  use super::*;
505
  use regex::Regex;
506
507
  impl WalkRevisioned for Regex {
508
    type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, Regex, R>;
509
510
    #[inline]
511
0
    fn walk_revisioned<'r, R: BorrowedReader>(
512
0
      reader: &'r mut R,
513
0
    ) -> Result<Self::Walker<'r, R>, Error> {
514
0
      Ok(LeafWalker::new(reader))
515
0
    }
516
  }
517
}
518
519
#[cfg(feature = "bytes")]
520
mod bytes_walk {
521
  use super::*;
522
  use bytes::Bytes;
523
524
  impl WalkRevisioned for Bytes {
525
    type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, Bytes, R>;
526
527
    #[inline]
528
0
    fn walk_revisioned<'r, R: BorrowedReader>(
529
0
      reader: &'r mut R,
530
0
    ) -> Result<Self::Walker<'r, R>, Error> {
531
0
      Ok(LeafWalker::new(reader))
532
0
    }
533
  }
534
}
535
536
#[cfg(feature = "roaring")]
537
mod roaring_walk {
538
  use super::*;
539
  use roaring::{RoaringBitmap, RoaringTreemap};
540
541
  impl WalkRevisioned for RoaringBitmap {
542
    type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, RoaringBitmap, R>;
543
544
    #[inline]
545
0
    fn walk_revisioned<'r, R: BorrowedReader>(
546
0
      reader: &'r mut R,
547
0
    ) -> Result<Self::Walker<'r, R>, Error> {
548
0
      Ok(LeafWalker::new(reader))
549
0
    }
550
  }
551
552
  impl WalkRevisioned for RoaringTreemap {
553
    type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, RoaringTreemap, R>;
554
555
    #[inline]
556
0
    fn walk_revisioned<'r, R: BorrowedReader>(
557
0
      reader: &'r mut R,
558
0
    ) -> Result<Self::Walker<'r, R>, Error> {
559
0
      Ok(LeafWalker::new(reader))
560
0
    }
561
  }
562
}
563
564
#[cfg(feature = "chrono")]
565
mod chrono_walk {
566
  use super::*;
567
  use chrono::{DateTime, Duration as ChronoDuration, NaiveDate, NaiveTime, Utc};
568
569
  impl WalkRevisioned for DateTime<Utc> {
570
    type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, DateTime<Utc>, R>;
571
572
    #[inline]
573
0
    fn walk_revisioned<'r, R: BorrowedReader>(
574
0
      reader: &'r mut R,
575
0
    ) -> Result<Self::Walker<'r, R>, Error> {
576
0
      Ok(LeafWalker::new(reader))
577
0
    }
578
  }
579
580
  impl WalkRevisioned for NaiveDate {
581
    type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, NaiveDate, R>;
582
583
    #[inline]
584
0
    fn walk_revisioned<'r, R: BorrowedReader>(
585
0
      reader: &'r mut R,
586
0
    ) -> Result<Self::Walker<'r, R>, Error> {
587
0
      Ok(LeafWalker::new(reader))
588
0
    }
589
  }
590
591
  impl WalkRevisioned for NaiveTime {
592
    type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, NaiveTime, R>;
593
594
    #[inline]
595
0
    fn walk_revisioned<'r, R: BorrowedReader>(
596
0
      reader: &'r mut R,
597
0
    ) -> Result<Self::Walker<'r, R>, Error> {
598
0
      Ok(LeafWalker::new(reader))
599
0
    }
600
  }
601
602
  impl WalkRevisioned for ChronoDuration {
603
    type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, ChronoDuration, R>;
604
605
    #[inline]
606
0
    fn walk_revisioned<'r, R: BorrowedReader>(
607
0
      reader: &'r mut R,
608
0
    ) -> Result<Self::Walker<'r, R>, Error> {
609
0
      Ok(LeafWalker::new(reader))
610
0
    }
611
  }
612
}
613
614
#[cfg(feature = "geo")]
615
mod geo_walk {
616
  use super::*;
617
  use geo::{Coord, LineString, MultiLineString, MultiPoint, MultiPolygon, Point, Polygon};
618
619
  macro_rules! geo_leaf {
620
    ($($t:ty),* $(,)?) => {$(
621
      impl WalkRevisioned for $t {
622
        type Walker<'r, R: BorrowedReader + 'r> = LeafWalker<'r, $t, R>;
623
624
        #[inline]
625
0
        fn walk_revisioned<'r, R: BorrowedReader>(
626
0
          reader: &'r mut R,
627
0
        ) -> Result<Self::Walker<'r, R>, Error> {
628
0
          Ok(LeafWalker::new(reader))
629
0
        }
Unexecuted instantiation: <geo_types::geometry::coord::Coord as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <geo_types::geometry::line_string::LineString as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <geo_types::geometry::polygon::Polygon as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <geo_types::geometry::multi_point::MultiPoint as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <geo_types::geometry::multi_line_string::MultiLineString as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <geo_types::geometry::multi_polygon::MultiPolygon as revision::walk::WalkRevisioned>::walk_revisioned::<_>
Unexecuted instantiation: <geo_types::geometry::point::Point as revision::walk::WalkRevisioned>::walk_revisioned::<_>
630
      }
631
    )*};
632
  }
633
634
  geo_leaf!(Coord, Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon);
635
}
636
637
#[cfg(feature = "imbl")]
638
mod imbl_walk {
639
  use super::*;
640
  use imbl::{HashMap as ImblHashMap, HashSet as ImblHashSet, OrdMap, OrdSet, Vector};
641
642
  impl<T> WalkRevisioned for Vector<T>
643
  where
644
    T: Revisioned + Clone,
645
  {
646
    type Walker<'r, R: BorrowedReader + 'r> = SeqWalker<'r, T, R>;
647
648
    #[inline]
649
    fn walk_revisioned<'r, R: BorrowedReader>(
650
      reader: &'r mut R,
651
    ) -> Result<Self::Walker<'r, R>, Error> {
652
      SeqWalker::new(reader)
653
    }
654
  }
655
656
  impl<K, V> WalkRevisioned for OrdMap<K, V>
657
  where
658
    K: Revisioned + Clone + Ord,
659
    V: Revisioned + Clone,
660
  {
661
    type Walker<'r, R: BorrowedReader + 'r> = MapWalker<'r, K, V, R>;
662
663
    #[inline]
664
    fn walk_revisioned<'r, R: BorrowedReader>(
665
      reader: &'r mut R,
666
    ) -> Result<Self::Walker<'r, R>, Error> {
667
      MapWalker::new(reader)
668
    }
669
  }
670
671
  impl<T> WalkRevisioned for OrdSet<T>
672
  where
673
    T: Revisioned + Clone + Ord,
674
  {
675
    type Walker<'r, R: BorrowedReader + 'r> = SeqWalker<'r, T, R>;
676
677
    #[inline]
678
    fn walk_revisioned<'r, R: BorrowedReader>(
679
      reader: &'r mut R,
680
    ) -> Result<Self::Walker<'r, R>, Error> {
681
      SeqWalker::new(reader)
682
    }
683
  }
684
685
  impl<K, V> WalkRevisioned for ImblHashMap<K, V>
686
  where
687
    K: Revisioned + Clone + Eq + Hash,
688
    V: Revisioned + Clone,
689
  {
690
    type Walker<'r, R: BorrowedReader + 'r> = MapWalker<'r, K, V, R>;
691
692
    #[inline]
693
    fn walk_revisioned<'r, R: BorrowedReader>(
694
      reader: &'r mut R,
695
    ) -> Result<Self::Walker<'r, R>, Error> {
696
      MapWalker::new(reader)
697
    }
698
  }
699
700
  impl<T> WalkRevisioned for ImblHashSet<T>
701
  where
702
    T: Revisioned + Clone + Eq + Hash,
703
  {
704
    type Walker<'r, R: BorrowedReader + 'r> = SeqWalker<'r, T, R>;
705
706
    #[inline]
707
    fn walk_revisioned<'r, R: BorrowedReader>(
708
      reader: &'r mut R,
709
    ) -> Result<Self::Walker<'r, R>, Error> {
710
      SeqWalker::new(reader)
711
    }
712
  }
713
}