1#![cfg_attr(
3 feature = "tracing",
4 allow(clippy::used_underscore_binding, reason = "Only used in tracing::instrument")
5)]
6
7mod de;
8mod ser;
9
10use ::alloc::{
11 borrow::{Cow, ToOwned},
12 boxed::Box,
13 collections::VecDeque,
14 string::String,
15 vec::Vec,
16};
17use ::core::{
18 fmt::Write,
19 marker::PhantomData,
20 ops::{Deref, DerefMut},
21};
22use ::serde::{Deserialize, Serialize};
23
24use crate::{Config, Result};
25
26#[cfg_attr(feature = "tracing", ::tracing::instrument(skip(value)))]
28pub fn to_value_with_config<T>(value: &T, config: Config) -> Result<Value<'static>>
29where
30 T: Serialize,
31{
32 let ser = ser::ValueSerializer::new(config.use_indices);
33 value.serialize(ser)
34}
35
36pub fn to_value<T>(value: &T) -> Result<Value<'static>>
38where
39 T: Serialize,
40{
41 to_value_with_config(value, Config::default())
42}
43
44#[cfg_attr(feature = "tracing", ::tracing::instrument(skip(value)))]
46pub fn from_value_with_config<'de, T>(value: Value<'de>, _config: Config) -> Result<T>
47where
48 T: Deserialize<'de>,
49{
50 let de = de::ValueDeserializer::new(value);
51 T::deserialize(de)
52}
53
54pub fn from_value<'de, T>(value: Value<'de>) -> Result<T>
56where
57 T: Deserialize<'de>,
58{
59 from_value_with_config(value, Config::default())
60}
61
62#[derive(Debug, Clone, Default)]
68pub enum Value<'a> {
69 #[default]
71 Null,
72 Bool(bool),
74 Integer(Integer),
76 Float(Float),
78 Bytes(Cow<'a, [u8]>),
80 String(Cow<'a, str>),
82 Array(VecDeque<Self>),
84 Map(VecDeque<(Self, Self)>),
86}
87
88#[derive(Debug, Clone, Default)]
90pub struct OwnedValue(Value<'static>);
91
92#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
94pub enum Integer {
95 Unsigned(u128),
97 Signed(i128),
99}
100
101#[derive(Debug, Clone, Copy, PartialEq)]
103pub enum Float {
104 F32(f32),
106 F64(f64),
108}
109
110impl<'a> Value<'a> {
111 pub fn borrow_clone(&self) -> Value<'_> {
113 match self {
114 Value::Null => Value::Null,
115 Value::Bool(b) => Value::Bool(*b),
116 Value::Integer(int) => Value::Integer(*int),
117 Value::Float(float) => Value::Float(*float),
118 Value::Bytes(bytes) => Value::Bytes(Cow::Borrowed(bytes)),
119 Value::String(s) => Value::String(Cow::Borrowed(s)),
120 Value::Array(arr) => Value::Array(arr.iter().map(Self::borrow_clone).collect()),
121 Value::Map(map) => Value::Map(
122 map.iter().map(|(key, value)| (key.borrow_clone(), value.borrow_clone())).collect(),
123 ),
124 }
125 }
126
127 #[must_use]
129 pub fn into_owned(self) -> OwnedValue {
130 let value = match self {
131 Value::Null => Value::Null,
132 Value::Bool(b) => Value::Bool(b),
133 Value::Integer(int) => Value::Integer(int),
134 Value::Float(float) => Value::Float(float),
135 Value::Bytes(bytes) => Value::Bytes(bytes.into_owned().into()),
136 Value::String(s) => Value::String(s.into_owned().into()),
137 Value::Array(arr) => Value::Array(arr.into_iter().map(|v| v.into_owned().0).collect()),
138 Value::Map(map) => Value::Map(
139 map.into_iter()
140 .map(|(key, value)| (key.into_owned().0, value.into_owned().0))
141 .collect(),
142 ),
143 };
144 OwnedValue(value)
145 }
146
147 #[inline]
149 pub fn deserialize_as<'de, T>(self) -> Result<T>
150 where
151 'a: 'de,
152 T: Deserialize<'de>,
153 {
154 T::deserialize(de::ValueDeserializer::new(self))
155 }
156
157 #[must_use]
162 #[inline]
163 pub fn is_empty(&self) -> bool {
164 match self {
165 Value::Null => true,
166 Value::Bool(_) | Value::Integer(_) | Value::Float(_) => false,
167 Value::Bytes(bytes) => bytes.is_empty(),
168 Value::String(s) => s.is_empty(),
169 Value::Array(arr) => arr.is_empty(),
170 Value::Map(map) => map.is_empty(),
171 }
172 }
173
174 #[must_use]
176 pub const fn as_bool(&self) -> Option<bool> {
177 if let Value::Bool(v) = self {
178 Some(*v)
179 } else {
180 None
181 }
182 }
183
184 #[must_use]
186 pub const fn as_int(&self) -> Option<Integer> {
187 if let Value::Integer(v) = self {
188 Some(*v)
189 } else {
190 None
191 }
192 }
193
194 #[must_use]
196 pub const fn as_float(&self) -> Option<Float> {
197 if let Value::Float(v) = self {
198 Some(*v)
199 } else {
200 None
201 }
202 }
203
204 #[must_use]
206 pub fn as_bytes(&self) -> Option<&[u8]> {
207 if let Value::Bytes(v) = self {
208 Some(v)
209 } else {
210 None
211 }
212 }
213
214 #[must_use]
216 pub fn as_string(&self) -> Option<&str> {
217 if let Value::String(v) = self {
218 Some(v)
219 } else {
220 None
221 }
222 }
223
224 #[must_use]
226 pub const fn as_array(&self) -> Option<&VecDeque<Value<'a>>> {
227 if let Value::Array(v) = self {
228 Some(v)
229 } else {
230 None
231 }
232 }
233
234 #[must_use]
236 pub const fn as_map(&self) -> Option<&VecDeque<(Value<'a>, Value<'a>)>> {
237 if let Value::Map(v) = self {
238 Some(v)
239 } else {
240 None
241 }
242 }
243
244 #[must_use]
246 pub fn into_values(self) -> Iter<Value<'static>> {
247 match self.into_owned().0 {
248 Value::Array(arr) => Iter::new(arr.into_iter()),
249 Value::Map(map) => Iter::new(map.into_iter().map(|(_key, value)| value)),
250 _ => Iter::new([].into_iter()),
251 }
252 }
253}
254
255impl OwnedValue {
256 #[must_use]
258 pub fn new(value: Value<'_>) -> Self {
259 value.into_owned()
260 }
261
262 #[must_use]
264 pub fn into_inner(self) -> Value<'static> {
265 self.0
266 }
267}
268
269impl Deref for OwnedValue {
270 type Target = Value<'static>;
271
272 fn deref(&self) -> &Self::Target {
273 &self.0
274 }
275}
276
277impl DerefMut for OwnedValue {
278 fn deref_mut(&mut self) -> &mut Self::Target {
279 &mut self.0
280 }
281}
282
283impl<'a> ::core::fmt::Display for Value<'a> {
284 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
285 match self {
286 Value::Null => f.write_str("null"),
287 Value::Bool(b) if *b => f.write_str("true"),
288 Value::Bool(_) => f.write_str("false"),
289 Value::Integer(int) => ::core::fmt::Display::fmt(int, f),
290 Value::Float(float) => ::core::fmt::Display::fmt(float, f),
291 Value::Bytes(bytes) => {
292 f.write_str("0x")?;
293 for (i, byte) in bytes.iter().enumerate() {
294 if i > 0 && i % 4 == 0 {
295 f.write_char('_')?;
296 }
297 write!(f, "{byte:02X}")?;
298 }
299 Ok(())
300 }
301 Value::String(s) => f.write_str(s),
302 Value::Array(arr) => {
303 f.write_char('[')?;
304 for (i, value) in arr.iter().enumerate() {
305 if i > 0 {
306 f.write_str(", ")?;
307 }
308 ::core::fmt::Display::fmt(value, f)?;
309 }
310 f.write_char(']')
311 }
312 Value::Map(map) => {
313 f.write_char('{')?;
314 for (i, (key, value)) in map.iter().enumerate() {
315 if i > 0 {
316 f.write_str(", ")?;
317 }
318 ::core::fmt::Display::fmt(key, f)?;
319 f.write_str(": ")?;
320 ::core::fmt::Display::fmt(value, f)?;
321 }
322 f.write_char('}')
323 }
324 }
325 }
326}
327
328impl ::core::fmt::Display for Integer {
329 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
330 match self {
331 Integer::Unsigned(int) => ::core::fmt::Display::fmt(int, f),
332 Integer::Signed(int) => ::core::fmt::Display::fmt(int, f),
333 }
334 }
335}
336
337impl ::core::fmt::Display for Float {
338 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
339 match self {
340 Float::F32(float) => ::core::fmt::Display::fmt(float, f),
341 Float::F64(float) => ::core::fmt::Display::fmt(float, f),
342 }
343 }
344}
345
346impl<'a> Serialize for Value<'a> {
347 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
348 where
349 S: ::serde::Serializer,
350 {
351 match self {
352 Value::Null => serializer.serialize_none(),
353 Value::Bool(b) => serializer.serialize_bool(*b),
354 Value::Integer(Integer::Unsigned(int)) => serializer.serialize_u128(*int),
355 Value::Integer(Integer::Signed(int)) => serializer.serialize_i128(*int),
356 Value::Float(Float::F32(float)) => serializer.serialize_f32(*float),
357 Value::Float(Float::F64(float)) => serializer.serialize_f64(*float),
358 Value::Bytes(bytes) => serializer.serialize_bytes(bytes),
359 Value::String(s) => serializer.serialize_str(s),
360 Value::Array(arr) => {
361 use ::serde::ser::SerializeSeq;
362
363 let mut ser = serializer.serialize_seq(Some(arr.len()))?;
364 for value in arr {
365 ser.serialize_element(value)?;
366 }
367 ser.end()
368 }
369 Value::Map(map) => {
370 use ::serde::ser::SerializeMap;
371
372 let mut ser = serializer.serialize_map(Some(map.len()))?;
373 for (key, value) in map {
374 ser.serialize_entry(key, value)?;
375 }
376 ser.end()
377 }
378 }
379 }
380}
381
382impl<'de> Deserialize<'de> for Value<'de> {
383 #[inline]
384 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
385 where
386 D: serde::Deserializer<'de>,
387 {
388 deserializer.deserialize_any(ValueVisitor::default())
389 }
390}
391
392impl<'de> Deserialize<'de> for OwnedValue {
393 #[inline]
394 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
395 where
396 D: serde::Deserializer<'de>,
397 {
398 deserializer.deserialize_any(ValueVisitor::default()).map(Value::into_owned)
399 }
400}
401
402#[derive(Debug, Clone, Copy, Default)]
404struct ValueVisitor<'a>(PhantomData<Value<'a>>);
405
406impl<'de> ::serde::de::Visitor<'de> for ValueVisitor<'de> {
407 type Value = Value<'de>;
408
409 #[inline]
410 fn expecting(&self, formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
411 formatter.write_str("any value")
412 }
413
414 #[inline]
415 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
416 where
417 E: serde::de::Error,
418 {
419 Ok(Value::Bool(v))
420 }
421
422 #[inline]
423 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
424 where
425 E: serde::de::Error,
426 {
427 self.visit_i128(i128::from(v))
428 }
429
430 #[inline]
431 fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
432 where
433 E: serde::de::Error,
434 {
435 Ok(Value::Integer(Integer::Signed(v)))
436 }
437
438 #[inline]
439 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
440 where
441 E: serde::de::Error,
442 {
443 self.visit_u128(u128::from(v))
444 }
445
446 #[inline]
447 fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
448 where
449 E: serde::de::Error,
450 {
451 Ok(Value::Integer(Integer::Unsigned(v)))
452 }
453
454 #[inline]
455 fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
456 where
457 E: serde::de::Error,
458 {
459 Ok(Value::Float(Float::F32(v)))
460 }
461
462 #[inline]
463 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
464 where
465 E: serde::de::Error,
466 {
467 Ok(Value::Float(Float::F64(v)))
468 }
469
470 #[inline]
471 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
472 where
473 E: serde::de::Error,
474 {
475 Ok(Value::String(Cow::Owned(v.to_owned())))
476 }
477
478 #[inline]
479 fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
480 where
481 E: serde::de::Error,
482 {
483 Ok(Value::String(Cow::Borrowed(v)))
484 }
485
486 #[inline]
487 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
488 where
489 E: serde::de::Error,
490 {
491 Ok(Value::String(Cow::Owned(v)))
492 }
493
494 #[inline]
495 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
496 where
497 E: serde::de::Error,
498 {
499 Ok(Value::Bytes(Cow::Owned(v.to_vec())))
500 }
501
502 #[inline]
503 fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
504 where
505 E: serde::de::Error,
506 {
507 Ok(Value::Bytes(Cow::Borrowed(v)))
508 }
509
510 #[inline]
511 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
512 where
513 E: serde::de::Error,
514 {
515 Ok(Value::Bytes(Cow::Owned(v)))
516 }
517
518 #[inline]
519 fn visit_none<E>(self) -> Result<Self::Value, E>
520 where
521 E: serde::de::Error,
522 {
523 Ok(Value::Null)
524 }
525
526 #[inline]
527 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
528 where
529 D: serde::Deserializer<'de>,
530 {
531 deserializer.deserialize_any(self)
532 }
533
534 #[inline]
535 fn visit_unit<E>(self) -> Result<Self::Value, E>
536 where
537 E: serde::de::Error,
538 {
539 Ok(Value::Null)
540 }
541
542 #[inline]
543 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
544 where
545 A: serde::de::SeqAccess<'de>,
546 {
547 let mut arr = seq.size_hint().map_or_else(VecDeque::new, VecDeque::with_capacity);
548
549 while let Some(value) = seq.next_element()? {
550 arr.push_back(value);
551 }
552
553 Ok(Value::Array(arr))
554 }
555
556 #[inline]
557 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
558 where
559 A: serde::de::MapAccess<'de>,
560 {
561 let mut entries = map.size_hint().map_or_else(VecDeque::new, VecDeque::with_capacity);
562
563 while let Some((key, value)) = map.next_entry()? {
564 entries.push_back((key, value));
565 }
566
567 Ok(Value::Map(entries))
568 }
569}
570
571impl<'a> PartialEq for Value<'a> {
572 fn eq(&self, other: &Self) -> bool {
573 match (self, other) {
574 (Self::Null, Self::Null) => true,
575 (Self::Bool(l0), Self::Bool(r0)) => l0 == r0,
576 (Self::Integer(l0), Self::Integer(r0)) => l0 == r0,
577 (Self::Float(l0), Self::Float(r0)) => l0 == r0,
578 (Self::Bytes(l0), Self::Bytes(r0)) => l0 == r0,
579 (Self::String(l0), Self::String(r0)) => l0 == r0,
580 (Self::Array(l0), Self::Array(r0)) => l0 == r0,
581 (Self::Map(l0), Self::Map(r0)) => l0 == r0,
582 _ => false,
583 }
584 }
585}
586
587impl<'a> PartialEq<bool> for Value<'a> {
588 fn eq(&self, other: &bool) -> bool {
589 match self {
590 Value::Bool(b) => b == other,
591 _ => false,
592 }
593 }
594}
595
596impl<'a> PartialEq<u128> for Value<'a> {
597 fn eq(&self, other: &u128) -> bool {
598 match self {
599 Value::Integer(Integer::Unsigned(int)) => int == other,
600 _ => false,
601 }
602 }
603}
604
605impl<'a> PartialEq<i128> for Value<'a> {
606 fn eq(&self, other: &i128) -> bool {
607 match self {
608 Value::Integer(Integer::Signed(int)) => int == other,
609 _ => false,
610 }
611 }
612}
613
614impl<'a> PartialEq<f32> for Value<'a> {
615 fn eq(&self, other: &f32) -> bool {
616 match self {
617 Value::Float(Float::F32(float)) => float == other,
618 Value::Float(Float::F64(float)) => *float == f64::from(*other),
619 _ => false,
620 }
621 }
622}
623
624impl<'a> PartialEq<f64> for Value<'a> {
625 fn eq(&self, other: &f64) -> bool {
626 match self {
627 Value::Float(Float::F32(float)) => f64::from(*float) == *other,
628 Value::Float(Float::F64(float)) => float == other,
629 _ => false,
630 }
631 }
632}
633
634impl<'a> PartialEq<[u8]> for Value<'a> {
635 fn eq(&self, other: &[u8]) -> bool {
636 match self {
637 Value::Bytes(bytes) => bytes.as_ref() == other,
638 _ => false,
639 }
640 }
641}
642
643impl<'a> PartialEq<str> for Value<'a> {
644 fn eq(&self, other: &str) -> bool {
645 match self {
646 Value::String(s) => s == other,
647 _ => false,
648 }
649 }
650}
651
652impl<'a> From<Option<Value<'a>>> for Value<'a> {
653 #[inline]
654 fn from(value: Option<Value<'a>>) -> Self {
655 value.unwrap_or_else(|| Value::Null)
656 }
657}
658
659impl<'a> From<()> for Value<'a> {
660 #[inline]
661 fn from(_: ()) -> Self {
662 Value::Null
663 }
664}
665
666impl<'a> From<bool> for Value<'a> {
667 #[inline]
668 fn from(value: bool) -> Self {
669 Value::Bool(value)
670 }
671}
672
673impl<'a> From<u8> for Value<'a> {
674 #[inline]
675 fn from(value: u8) -> Self {
676 Value::Integer(Integer::Unsigned(u128::from(value)))
677 }
678}
679
680impl<'a> From<i8> for Value<'a> {
681 #[inline]
682 fn from(value: i8) -> Self {
683 Value::Integer(Integer::Signed(i128::from(value)))
684 }
685}
686
687impl<'a> From<u16> for Value<'a> {
688 #[inline]
689 fn from(value: u16) -> Self {
690 Value::Integer(Integer::Unsigned(u128::from(value)))
691 }
692}
693
694impl<'a> From<i16> for Value<'a> {
695 #[inline]
696 fn from(value: i16) -> Self {
697 Value::Integer(Integer::Signed(i128::from(value)))
698 }
699}
700
701impl<'a> From<u32> for Value<'a> {
702 #[inline]
703 fn from(value: u32) -> Self {
704 Value::Integer(Integer::Unsigned(u128::from(value)))
705 }
706}
707
708impl<'a> From<i32> for Value<'a> {
709 #[inline]
710 fn from(value: i32) -> Self {
711 Value::Integer(Integer::Signed(i128::from(value)))
712 }
713}
714
715impl<'a> From<u64> for Value<'a> {
716 #[inline]
717 fn from(value: u64) -> Self {
718 Value::Integer(Integer::Unsigned(u128::from(value)))
719 }
720}
721
722impl<'a> From<i64> for Value<'a> {
723 #[inline]
724 fn from(value: i64) -> Self {
725 Value::Integer(Integer::Signed(i128::from(value)))
726 }
727}
728
729impl<'a> From<usize> for Value<'a> {
730 #[inline]
731 fn from(value: usize) -> Self {
732 Value::Integer(Integer::Unsigned(value as u128))
733 }
734}
735
736impl<'a> From<isize> for Value<'a> {
737 #[inline]
738 fn from(value: isize) -> Self {
739 Value::Integer(Integer::Signed(value as i128))
740 }
741}
742
743impl<'a> From<u128> for Value<'a> {
744 #[inline]
745 fn from(value: u128) -> Self {
746 Value::Integer(Integer::Unsigned(value))
747 }
748}
749
750impl<'a> From<i128> for Value<'a> {
751 #[inline]
752 fn from(value: i128) -> Self {
753 Value::Integer(Integer::Signed(value))
754 }
755}
756
757impl<'a> From<f32> for Value<'a> {
758 #[inline]
759 fn from(value: f32) -> Self {
760 Value::Float(Float::F32(value))
761 }
762}
763
764impl<'a> From<f64> for Value<'a> {
765 #[inline]
766 fn from(value: f64) -> Self {
767 Value::Float(Float::F64(value))
768 }
769}
770
771impl<'a> From<&'a [u8]> for Value<'a> {
772 #[inline]
773 fn from(value: &'a [u8]) -> Self {
774 Value::Bytes(Cow::Borrowed(value))
775 }
776}
777
778impl<'a> From<Vec<u8>> for Value<'a> {
779 #[inline]
780 fn from(value: Vec<u8>) -> Self {
781 Value::Bytes(Cow::Owned(value))
782 }
783}
784
785impl<'a> From<Cow<'a, [u8]>> for Value<'a> {
786 #[inline]
787 fn from(value: Cow<'a, [u8]>) -> Self {
788 Value::Bytes(value)
789 }
790}
791
792impl<'a> From<&'a str> for Value<'a> {
793 #[inline]
794 fn from(value: &'a str) -> Self {
795 Value::String(Cow::Borrowed(value))
796 }
797}
798
799impl<'a> From<String> for Value<'a> {
800 #[inline]
801 fn from(value: String) -> Self {
802 Value::String(Cow::Owned(value))
803 }
804}
805
806impl<'a> From<Cow<'a, str>> for Value<'a> {
807 #[inline]
808 fn from(value: Cow<'a, str>) -> Self {
809 Value::String(value)
810 }
811}
812
813impl<'a> From<VecDeque<Value<'a>>> for Value<'a> {
814 #[inline]
815 fn from(value: VecDeque<Value<'a>>) -> Self {
816 Value::Array(value)
817 }
818}
819
820impl<'a> From<VecDeque<(Value<'a>, Value<'a>)>> for Value<'a> {
821 #[inline]
822 fn from(value: VecDeque<(Value<'a>, Value<'a>)>) -> Self {
823 Value::Map(value)
824 }
825}
826
827impl<'a, T> FromIterator<T> for Value<'a>
828where
829 T: Into<Value<'a>>,
830{
831 #[inline]
832 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
833 Self::from(iter.into_iter().map(Into::into).collect::<VecDeque<_>>())
834 }
835}
836
837impl<'a, K, V> FromIterator<(K, V)> for Value<'a>
838where
839 K: Into<Value<'a>>,
840 V: Into<Value<'a>>,
841{
842 #[inline]
843 fn from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self {
844 Self::from(iter.into_iter().map(|(k, v)| (k.into(), v.into())).collect::<VecDeque<_>>())
845 }
846}
847
848trait AllIteratorTrait<Item>:
850 Iterator<Item = Item> + ExactSizeIterator + DoubleEndedIterator + ::core::fmt::Debug
851{
852}
853impl<I, T> AllIteratorTrait<T> for I where
854 I: Iterator<Item = T> + ExactSizeIterator + DoubleEndedIterator + ::core::fmt::Debug
855{
856}
857
858#[derive(Debug)]
860pub struct Iter<T>(Box<dyn AllIteratorTrait<T> + Send + Sync>);
861
862impl<T> Iter<T> {
863 fn new<I>(iter: I) -> Self
865 where
866 I: AllIteratorTrait<T> + Send + Sync + 'static,
867 {
868 Self(Box::new(iter))
869 }
870}
871
872impl<T> Iterator for Iter<T> {
873 type Item = T;
874
875 fn next(&mut self) -> Option<Self::Item> {
876 self.0.next()
877 }
878
879 fn size_hint(&self) -> (usize, Option<usize>) {
880 self.0.size_hint()
881 }
882
883 fn count(self) -> usize
884 where
885 Self: Sized,
886 {
887 self.0.count()
888 }
889
890 fn last(self) -> Option<Self::Item>
891 where
892 Self: Sized,
893 {
894 self.0.last()
895 }
896
897 fn nth(&mut self, n: usize) -> Option<Self::Item> {
898 self.0.nth(n)
899 }
900}
901
902impl<T> ExactSizeIterator for Iter<T> {
903 fn len(&self) -> usize {
904 self.0.len()
905 }
906}
907
908impl<T> DoubleEndedIterator for Iter<T> {
909 fn next_back(&mut self) -> Option<Self::Item> {
910 self.0.next_back()
911 }
912
913 fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
914 self.0.nth_back(n)
915 }
916}
917
918
919#[cfg(test)]
920mod tests;