1use crate::error::Error;
15use crate::value::Value;
16use alloc::string::String;
17#[cfg(feature = "preserve_order")]
18use alloc::vec::Vec;
19use core::borrow::Borrow;
20use core::fmt::{self, Debug};
21use core::hash::{Hash, Hasher};
22use core::iter::FusedIterator;
23#[cfg(feature = "preserve_order")]
24use core::mem;
25use core::ops;
26use serde::de;
27
28#[cfg(not(feature = "preserve_order"))]
29use alloc::collections::{btree_map, BTreeMap};
30#[cfg(feature = "preserve_order")]
31use indexmap::IndexMap;
32
33pub struct Map<K, V> {
35 map: MapImpl<K, V>,
36}
37
38#[cfg(not(feature = "preserve_order"))]
39type MapImpl<K, V> = BTreeMap<K, V>;
40#[cfg(feature = "preserve_order")]
41type MapImpl<K, V> = IndexMap<K, V, BuildHasherImpl>;
42
43#[cfg(all(feature = "preserve_order", feature = "std"))]
44type BuildHasherImpl = std::collections::hash_map::RandomState;
45#[cfg(all(feature = "preserve_order", not(feature = "std")))]
46type BuildHasherImpl = foldhash::fast::RandomState;
47
48impl Map<String, Value> {
49 #[inline]
51 pub fn new() -> Self {
52 Map {
53 map: MapImpl::default(),
54 }
55 }
56
57 #[inline]
59 pub fn with_capacity(capacity: usize) -> Self {
60 Map {
61 #[cfg(not(feature = "preserve_order"))]
62 map: {
63 let _ = capacity;
65 BTreeMap::new()
66 },
67 #[cfg(feature = "preserve_order")]
68 map: IndexMap::with_capacity_and_hasher(capacity, BuildHasherImpl::default()),
69 }
70 }
71
72 #[inline]
74 pub fn clear(&mut self) {
75 self.map.clear();
76 }
77
78 #[inline]
83 pub fn get<Q>(&self, key: &Q) -> Option<&Value>
84 where
85 String: Borrow<Q>,
86 Q: ?Sized + Ord + Eq + Hash,
87 {
88 self.map.get(key)
89 }
90
91 #[inline]
96 pub fn contains_key<Q>(&self, key: &Q) -> bool
97 where
98 String: Borrow<Q>,
99 Q: ?Sized + Ord + Eq + Hash,
100 {
101 self.map.contains_key(key)
102 }
103
104 #[inline]
109 pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut Value>
110 where
111 String: Borrow<Q>,
112 Q: ?Sized + Ord + Eq + Hash,
113 {
114 self.map.get_mut(key)
115 }
116
117 #[inline]
122 pub fn get_key_value<Q>(&self, key: &Q) -> Option<(&String, &Value)>
123 where
124 String: Borrow<Q>,
125 Q: ?Sized + Ord + Eq + Hash,
126 {
127 self.map.get_key_value(key)
128 }
129
130 #[inline]
137 pub fn insert(&mut self, k: String, v: Value) -> Option<Value> {
138 self.map.insert(k, v)
139 }
140
141 #[cfg(feature = "preserve_order")]
148 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
149 #[inline]
150 pub fn shift_insert(&mut self, index: usize, k: String, v: Value) -> Option<Value> {
151 self.map.shift_insert(index, k, v)
152 }
153
154 #[inline]
166 pub fn remove<Q>(&mut self, key: &Q) -> Option<Value>
167 where
168 String: Borrow<Q>,
169 Q: ?Sized + Ord + Eq + Hash,
170 {
171 #[cfg(feature = "preserve_order")]
172 return self.swap_remove(key);
173 #[cfg(not(feature = "preserve_order"))]
174 return self.map.remove(key);
175 }
176
177 #[inline]
189 pub fn remove_entry<Q>(&mut self, key: &Q) -> Option<(String, Value)>
190 where
191 String: Borrow<Q>,
192 Q: ?Sized + Ord + Eq + Hash,
193 {
194 #[cfg(feature = "preserve_order")]
195 return self.swap_remove_entry(key);
196 #[cfg(not(feature = "preserve_order"))]
197 return self.map.remove_entry(key);
198 }
199
200 #[cfg(feature = "preserve_order")]
208 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
209 #[inline]
210 pub fn swap_remove<Q>(&mut self, key: &Q) -> Option<Value>
211 where
212 String: Borrow<Q>,
213 Q: ?Sized + Ord + Eq + Hash,
214 {
215 self.map.swap_remove(key)
216 }
217
218 #[cfg(feature = "preserve_order")]
226 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
227 #[inline]
228 pub fn swap_remove_entry<Q>(&mut self, key: &Q) -> Option<(String, Value)>
229 where
230 String: Borrow<Q>,
231 Q: ?Sized + Ord + Eq + Hash,
232 {
233 self.map.swap_remove_entry(key)
234 }
235
236 #[cfg(feature = "preserve_order")]
244 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
245 #[inline]
246 pub fn shift_remove<Q>(&mut self, key: &Q) -> Option<Value>
247 where
248 String: Borrow<Q>,
249 Q: ?Sized + Ord + Eq + Hash,
250 {
251 self.map.shift_remove(key)
252 }
253
254 #[cfg(feature = "preserve_order")]
262 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
263 #[inline]
264 pub fn shift_remove_entry<Q>(&mut self, key: &Q) -> Option<(String, Value)>
265 where
266 String: Borrow<Q>,
267 Q: ?Sized + Ord + Eq + Hash,
268 {
269 self.map.shift_remove_entry(key)
270 }
271
272 #[inline]
274 pub fn append(&mut self, other: &mut Self) {
275 #[cfg(feature = "preserve_order")]
276 self.map
277 .extend(mem::replace(&mut other.map, MapImpl::default()));
278 #[cfg(not(feature = "preserve_order"))]
279 self.map.append(&mut other.map);
280 }
281
282 pub fn entry<S>(&mut self, key: S) -> Entry
285 where
286 S: Into<String>,
287 {
288 #[cfg(not(feature = "preserve_order"))]
289 use alloc::collections::btree_map::Entry as EntryImpl;
290 #[cfg(feature = "preserve_order")]
291 use indexmap::map::Entry as EntryImpl;
292
293 match self.map.entry(key.into()) {
294 EntryImpl::Vacant(vacant) => Entry::Vacant(VacantEntry { vacant }),
295 EntryImpl::Occupied(occupied) => Entry::Occupied(OccupiedEntry { occupied }),
296 }
297 }
298
299 #[inline]
301 pub fn len(&self) -> usize {
302 self.map.len()
303 }
304
305 #[inline]
307 pub fn is_empty(&self) -> bool {
308 self.map.is_empty()
309 }
310
311 #[inline]
313 pub fn iter(&self) -> Iter {
314 Iter {
315 iter: self.map.iter(),
316 }
317 }
318
319 #[inline]
321 pub fn iter_mut(&mut self) -> IterMut {
322 IterMut {
323 iter: self.map.iter_mut(),
324 }
325 }
326
327 #[inline]
329 pub fn keys(&self) -> Keys {
330 Keys {
331 iter: self.map.keys(),
332 }
333 }
334
335 #[inline]
337 pub fn values(&self) -> Values {
338 Values {
339 iter: self.map.values(),
340 }
341 }
342
343 #[inline]
345 pub fn values_mut(&mut self) -> ValuesMut {
346 ValuesMut {
347 iter: self.map.values_mut(),
348 }
349 }
350
351 #[inline]
353 pub fn into_values(self) -> IntoValues {
354 IntoValues {
355 iter: self.map.into_values(),
356 }
357 }
358
359 #[inline]
364 pub fn retain<F>(&mut self, f: F)
365 where
366 F: FnMut(&String, &mut Value) -> bool,
367 {
368 self.map.retain(f);
369 }
370
371 #[inline]
389 pub fn sort_keys(&mut self) {
390 #[cfg(feature = "preserve_order")]
391 self.map.sort_unstable_keys();
392 }
393}
394
395#[allow(clippy::derivable_impls)] impl Default for Map<String, Value> {
397 #[inline]
398 fn default() -> Self {
399 Map::new()
400 }
401}
402
403impl Clone for Map<String, Value> {
404 #[inline]
405 fn clone(&self) -> Self {
406 Map {
407 map: self.map.clone(),
408 }
409 }
410
411 #[inline]
412 fn clone_from(&mut self, source: &Self) {
413 self.map.clone_from(&source.map);
414 }
415}
416
417impl PartialEq for Map<String, Value> {
418 #[inline]
419 fn eq(&self, other: &Self) -> bool {
420 self.map.eq(&other.map)
421 }
422}
423
424impl Eq for Map<String, Value> {}
425
426impl Hash for Map<String, Value> {
427 fn hash<H: Hasher>(&self, state: &mut H) {
428 #[cfg(not(feature = "preserve_order"))]
429 {
430 self.map.hash(state);
431 }
432
433 #[cfg(feature = "preserve_order")]
434 {
435 let mut kv = Vec::from_iter(&self.map);
436 kv.sort_unstable_by(|a, b| a.0.cmp(b.0));
437 kv.hash(state);
438 }
439 }
440}
441
442impl<Q> ops::Index<&Q> for Map<String, Value>
459where
460 String: Borrow<Q>,
461 Q: ?Sized + Ord + Eq + Hash,
462{
463 type Output = Value;
464
465 fn index(&self, index: &Q) -> &Value {
466 self.map.index(index)
467 }
468}
469
470impl<Q> ops::IndexMut<&Q> for Map<String, Value>
482where
483 String: Borrow<Q>,
484 Q: ?Sized + Ord + Eq + Hash,
485{
486 fn index_mut(&mut self, index: &Q) -> &mut Value {
487 self.map.get_mut(index).expect("no entry found for key")
488 }
489}
490
491impl Debug for Map<String, Value> {
492 #[inline]
493 fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> {
494 self.map.fmt(formatter)
495 }
496}
497
498#[cfg(any(feature = "std", feature = "alloc"))]
499impl serde::ser::Serialize for Map<String, Value> {
500 #[inline]
501 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
502 where
503 S: serde::ser::Serializer,
504 {
505 use serde::ser::SerializeMap;
506 let mut map = match serializer.serialize_map(Some(self.len())) {
core::result::Result::Ok(val) => val,
core::result::Result::Err(err) => return core::result::Result::Err(err),
}tri!(serializer.serialize_map(Some(self.len())));
507 for (k, v) in self {
508 match map.serialize_entry(k, v) {
core::result::Result::Ok(val) => val,
core::result::Result::Err(err) => return core::result::Result::Err(err),
};tri!(map.serialize_entry(k, v));
509 }
510 map.end()
511 }
512}
513
514impl<'de> de::Deserialize<'de> for Map<String, Value> {
515 #[inline]
516 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
517 where
518 D: de::Deserializer<'de>,
519 {
520 struct Visitor;
521
522 impl<'de> de::Visitor<'de> for Visitor {
523 type Value = Map<String, Value>;
524
525 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
526 formatter.write_str("a map")
527 }
528
529 #[inline]
530 fn visit_unit<E>(self) -> Result<Self::Value, E>
531 where
532 E: de::Error,
533 {
534 Ok(Map::new())
535 }
536
537 #[cfg(any(feature = "std", feature = "alloc"))]
538 #[inline]
539 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
540 where
541 V: de::MapAccess<'de>,
542 {
543 let mut values = Map::new();
544
545 while let Some((key, value)) = match visitor.next_entry() {
core::result::Result::Ok(val) => val,
core::result::Result::Err(err) => return core::result::Result::Err(err),
}tri!(visitor.next_entry()) {
546 values.insert(key, value);
547 }
548
549 Ok(values)
550 }
551 }
552
553 deserializer.deserialize_map(Visitor)
554 }
555}
556
557impl FromIterator<(String, Value)> for Map<String, Value> {
558 fn from_iter<T>(iter: T) -> Self
559 where
560 T: IntoIterator<Item = (String, Value)>,
561 {
562 Map {
563 map: FromIterator::from_iter(iter),
564 }
565 }
566}
567
568impl Extend<(String, Value)> for Map<String, Value> {
569 fn extend<T>(&mut self, iter: T)
570 where
571 T: IntoIterator<Item = (String, Value)>,
572 {
573 self.map.extend(iter);
574 }
575}
576
577macro_rules! delegate_iterator {
578 (($name:ident $($generics:tt)*) => $item:ty) => {
579 impl $($generics)* Iterator for $name $($generics)* {
580 type Item = $item;
581 #[inline]
582 fn next(&mut self) -> Option<Self::Item> {
583 self.iter.next()
584 }
585 #[inline]
586 fn size_hint(&self) -> (usize, Option<usize>) {
587 self.iter.size_hint()
588 }
589 }
590
591 impl $($generics)* DoubleEndedIterator for $name $($generics)* {
592 #[inline]
593 fn next_back(&mut self) -> Option<Self::Item> {
594 self.iter.next_back()
595 }
596 }
597
598 impl $($generics)* ExactSizeIterator for $name $($generics)* {
599 #[inline]
600 fn len(&self) -> usize {
601 self.iter.len()
602 }
603 }
604
605 impl $($generics)* FusedIterator for $name $($generics)* {}
606 }
607}
608
609impl<'de> de::IntoDeserializer<'de, Error> for Map<String, Value> {
610 type Deserializer = Self;
611
612 fn into_deserializer(self) -> Self::Deserializer {
613 self
614 }
615}
616
617impl<'de> de::IntoDeserializer<'de, Error> for &'de Map<String, Value> {
618 type Deserializer = Self;
619
620 fn into_deserializer(self) -> Self::Deserializer {
621 self
622 }
623}
624
625pub enum Entry<'a> {
632 Vacant(VacantEntry<'a>),
634 Occupied(OccupiedEntry<'a>),
636}
637
638pub struct VacantEntry<'a> {
640 vacant: VacantEntryImpl<'a>,
641}
642
643pub struct OccupiedEntry<'a> {
645 occupied: OccupiedEntryImpl<'a>,
646}
647
648#[cfg(not(feature = "preserve_order"))]
649type VacantEntryImpl<'a> = btree_map::VacantEntry<'a, String, Value>;
650#[cfg(feature = "preserve_order")]
651type VacantEntryImpl<'a> = indexmap::map::VacantEntry<'a, String, Value>;
652
653#[cfg(not(feature = "preserve_order"))]
654type OccupiedEntryImpl<'a> = btree_map::OccupiedEntry<'a, String, Value>;
655#[cfg(feature = "preserve_order")]
656type OccupiedEntryImpl<'a> = indexmap::map::OccupiedEntry<'a, String, Value>;
657
658impl<'a> Entry<'a> {
659 pub fn key(&self) -> &String {
668 match self {
669 Entry::Vacant(e) => e.key(),
670 Entry::Occupied(e) => e.key(),
671 }
672 }
673
674 pub fn or_insert(self, default: Value) -> &'a mut Value {
688 match self {
689 Entry::Vacant(entry) => entry.insert(default),
690 Entry::Occupied(entry) => entry.into_mut(),
691 }
692 }
693
694 pub fn or_insert_with<F>(self, default: F) -> &'a mut Value
709 where
710 F: FnOnce() -> Value,
711 {
712 match self {
713 Entry::Vacant(entry) => entry.insert(default()),
714 Entry::Occupied(entry) => entry.into_mut(),
715 }
716 }
717
718 pub fn and_modify<F>(self, f: F) -> Self
740 where
741 F: FnOnce(&mut Value),
742 {
743 match self {
744 Entry::Occupied(mut entry) => {
745 f(entry.get_mut());
746 Entry::Occupied(entry)
747 }
748 Entry::Vacant(entry) => Entry::Vacant(entry),
749 }
750 }
751}
752
753impl<'a> VacantEntry<'a> {
754 #[inline]
772 pub fn key(&self) -> &String {
773 self.vacant.key()
774 }
775
776 #[inline]
796 pub fn insert(self, value: Value) -> &'a mut Value {
797 self.vacant.insert(value)
798 }
799}
800
801impl<'a> OccupiedEntry<'a> {
802 #[inline]
822 pub fn key(&self) -> &String {
823 self.occupied.key()
824 }
825
826 #[inline]
846 pub fn get(&self) -> &Value {
847 self.occupied.get()
848 }
849
850 #[inline]
872 pub fn get_mut(&mut self) -> &mut Value {
873 self.occupied.get_mut()
874 }
875
876 #[inline]
898 pub fn into_mut(self) -> &'a mut Value {
899 self.occupied.into_mut()
900 }
901
902 #[inline]
924 pub fn insert(&mut self, value: Value) -> Value {
925 self.occupied.insert(value)
926 }
927
928 #[inline]
954 pub fn remove(self) -> Value {
955 #[cfg(feature = "preserve_order")]
956 return self.swap_remove();
957 #[cfg(not(feature = "preserve_order"))]
958 return self.occupied.remove();
959 }
960
961 #[cfg(feature = "preserve_order")]
969 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
970 #[inline]
971 pub fn swap_remove(self) -> Value {
972 self.occupied.swap_remove()
973 }
974
975 #[cfg(feature = "preserve_order")]
983 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
984 #[inline]
985 pub fn shift_remove(self) -> Value {
986 self.occupied.shift_remove()
987 }
988
989 #[inline]
1017 pub fn remove_entry(self) -> (String, Value) {
1018 #[cfg(feature = "preserve_order")]
1019 return self.swap_remove_entry();
1020 #[cfg(not(feature = "preserve_order"))]
1021 return self.occupied.remove_entry();
1022 }
1023
1024 #[cfg(feature = "preserve_order")]
1032 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
1033 #[inline]
1034 pub fn swap_remove_entry(self) -> (String, Value) {
1035 self.occupied.swap_remove_entry()
1036 }
1037
1038 #[cfg(feature = "preserve_order")]
1046 #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))]
1047 #[inline]
1048 pub fn shift_remove_entry(self) -> (String, Value) {
1049 self.occupied.shift_remove_entry()
1050 }
1051}
1052
1053impl<'a> IntoIterator for &'a Map<String, Value> {
1056 type Item = (&'a String, &'a Value);
1057 type IntoIter = Iter<'a>;
1058 #[inline]
1059 fn into_iter(self) -> Self::IntoIter {
1060 Iter {
1061 iter: self.map.iter(),
1062 }
1063 }
1064}
1065
1066#[derive(#[automatically_derived]
impl<'a> ::core::clone::Clone for Iter<'a> {
#[inline]
fn clone(&self) -> Self {
Iter { iter: ::core::clone::Clone::clone(&self.iter) }
}
}Clone, #[automatically_derived]
impl<'a> ::core::fmt::Debug for Iter<'a> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "Iter", "iter",
&&self.iter)
}
}Debug)]
1068pub struct Iter<'a> {
1069 iter: IterImpl<'a>,
1070}
1071
1072#[cfg(not(feature = "preserve_order"))]
1073type IterImpl<'a> = btree_map::Iter<'a, String, Value>;
1074#[cfg(feature = "preserve_order")]
1075type IterImpl<'a> = indexmap::map::Iter<'a, String, Value>;
1076
1077impl<'a> Iterator for Iter<'a> {
type Item = (&'a String, &'a Value);
#[inline]
fn next(&mut self) -> Option<Self::Item> { self.iter.next() }
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
impl<'a> DoubleEndedIterator for Iter<'a> {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> { self.iter.next_back() }
}
impl<'a> ExactSizeIterator for Iter<'a> {
#[inline]
fn len(&self) -> usize { self.iter.len() }
}
impl<'a> FusedIterator for Iter<'a> {}delegate_iterator!((Iter<'a>) => (&'a String, &'a Value));
1078
1079impl<'a> IntoIterator for &'a mut Map<String, Value> {
1082 type Item = (&'a String, &'a mut Value);
1083 type IntoIter = IterMut<'a>;
1084 #[inline]
1085 fn into_iter(self) -> Self::IntoIter {
1086 IterMut {
1087 iter: self.map.iter_mut(),
1088 }
1089 }
1090}
1091
1092#[derive(#[automatically_derived]
impl<'a> ::core::fmt::Debug for IterMut<'a> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "IterMut",
"iter", &&self.iter)
}
}Debug)]
1094pub struct IterMut<'a> {
1095 iter: IterMutImpl<'a>,
1096}
1097
1098#[cfg(not(feature = "preserve_order"))]
1099type IterMutImpl<'a> = btree_map::IterMut<'a, String, Value>;
1100#[cfg(feature = "preserve_order")]
1101type IterMutImpl<'a> = indexmap::map::IterMut<'a, String, Value>;
1102
1103impl<'a> Iterator for IterMut<'a> {
type Item = (&'a String, &'a mut Value);
#[inline]
fn next(&mut self) -> Option<Self::Item> { self.iter.next() }
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
impl<'a> DoubleEndedIterator for IterMut<'a> {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> { self.iter.next_back() }
}
impl<'a> ExactSizeIterator for IterMut<'a> {
#[inline]
fn len(&self) -> usize { self.iter.len() }
}
impl<'a> FusedIterator for IterMut<'a> {}delegate_iterator!((IterMut<'a>) => (&'a String, &'a mut Value));
1104
1105impl IntoIterator for Map<String, Value> {
1108 type Item = (String, Value);
1109 type IntoIter = IntoIter;
1110 #[inline]
1111 fn into_iter(self) -> Self::IntoIter {
1112 IntoIter {
1113 iter: self.map.into_iter(),
1114 }
1115 }
1116}
1117
1118#[derive(#[automatically_derived]
impl ::core::fmt::Debug for IntoIter {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "IntoIter",
"iter", &&self.iter)
}
}Debug)]
1120pub struct IntoIter {
1121 iter: IntoIterImpl,
1122}
1123
1124#[cfg(not(feature = "preserve_order"))]
1125type IntoIterImpl = btree_map::IntoIter<String, Value>;
1126#[cfg(feature = "preserve_order")]
1127type IntoIterImpl = indexmap::map::IntoIter<String, Value>;
1128
1129impl Iterator for IntoIter {
type Item = (String, Value);
#[inline]
fn next(&mut self) -> Option<Self::Item> { self.iter.next() }
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
impl DoubleEndedIterator for IntoIter {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> { self.iter.next_back() }
}
impl ExactSizeIterator for IntoIter {
#[inline]
fn len(&self) -> usize { self.iter.len() }
}
impl FusedIterator for IntoIter {}delegate_iterator!((IntoIter) => (String, Value));
1130
1131#[derive(#[automatically_derived]
impl<'a> ::core::clone::Clone for Keys<'a> {
#[inline]
fn clone(&self) -> Self {
Keys { iter: ::core::clone::Clone::clone(&self.iter) }
}
}Clone, #[automatically_derived]
impl<'a> ::core::fmt::Debug for Keys<'a> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "Keys", "iter",
&&self.iter)
}
}Debug)]
1135pub struct Keys<'a> {
1136 iter: KeysImpl<'a>,
1137}
1138
1139#[cfg(not(feature = "preserve_order"))]
1140type KeysImpl<'a> = btree_map::Keys<'a, String, Value>;
1141#[cfg(feature = "preserve_order")]
1142type KeysImpl<'a> = indexmap::map::Keys<'a, String, Value>;
1143
1144impl<'a> Iterator for Keys<'a> {
type Item = &'a String;
#[inline]
fn next(&mut self) -> Option<Self::Item> { self.iter.next() }
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
impl<'a> DoubleEndedIterator for Keys<'a> {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> { self.iter.next_back() }
}
impl<'a> ExactSizeIterator for Keys<'a> {
#[inline]
fn len(&self) -> usize { self.iter.len() }
}
impl<'a> FusedIterator for Keys<'a> {}delegate_iterator!((Keys<'a>) => &'a String);
1145
1146#[derive(#[automatically_derived]
impl<'a> ::core::clone::Clone for Values<'a> {
#[inline]
fn clone(&self) -> Self {
Values { iter: ::core::clone::Clone::clone(&self.iter) }
}
}Clone, #[automatically_derived]
impl<'a> ::core::fmt::Debug for Values<'a> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "Values",
"iter", &&self.iter)
}
}Debug)]
1150pub struct Values<'a> {
1151 iter: ValuesImpl<'a>,
1152}
1153
1154#[cfg(not(feature = "preserve_order"))]
1155type ValuesImpl<'a> = btree_map::Values<'a, String, Value>;
1156#[cfg(feature = "preserve_order")]
1157type ValuesImpl<'a> = indexmap::map::Values<'a, String, Value>;
1158
1159impl<'a> Iterator for Values<'a> {
type Item = &'a Value;
#[inline]
fn next(&mut self) -> Option<Self::Item> { self.iter.next() }
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
impl<'a> DoubleEndedIterator for Values<'a> {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> { self.iter.next_back() }
}
impl<'a> ExactSizeIterator for Values<'a> {
#[inline]
fn len(&self) -> usize { self.iter.len() }
}
impl<'a> FusedIterator for Values<'a> {}delegate_iterator!((Values<'a>) => &'a Value);
1160
1161#[derive(#[automatically_derived]
impl<'a> ::core::fmt::Debug for ValuesMut<'a> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "ValuesMut",
"iter", &&self.iter)
}
}Debug)]
1165pub struct ValuesMut<'a> {
1166 iter: ValuesMutImpl<'a>,
1167}
1168
1169#[cfg(not(feature = "preserve_order"))]
1170type ValuesMutImpl<'a> = btree_map::ValuesMut<'a, String, Value>;
1171#[cfg(feature = "preserve_order")]
1172type ValuesMutImpl<'a> = indexmap::map::ValuesMut<'a, String, Value>;
1173
1174impl<'a> Iterator for ValuesMut<'a> {
type Item = &'a mut Value;
#[inline]
fn next(&mut self) -> Option<Self::Item> { self.iter.next() }
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
impl<'a> DoubleEndedIterator for ValuesMut<'a> {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> { self.iter.next_back() }
}
impl<'a> ExactSizeIterator for ValuesMut<'a> {
#[inline]
fn len(&self) -> usize { self.iter.len() }
}
impl<'a> FusedIterator for ValuesMut<'a> {}delegate_iterator!((ValuesMut<'a>) => &'a mut Value);
1175
1176#[derive(#[automatically_derived]
impl ::core::fmt::Debug for IntoValues {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "IntoValues",
"iter", &&self.iter)
}
}Debug)]
1180pub struct IntoValues {
1181 iter: IntoValuesImpl,
1182}
1183
1184#[cfg(not(feature = "preserve_order"))]
1185type IntoValuesImpl = btree_map::IntoValues<String, Value>;
1186#[cfg(feature = "preserve_order")]
1187type IntoValuesImpl = indexmap::map::IntoValues<String, Value>;
1188
1189impl Iterator for IntoValues {
type Item = Value;
#[inline]
fn next(&mut self) -> Option<Self::Item> { self.iter.next() }
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
impl DoubleEndedIterator for IntoValues {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> { self.iter.next_back() }
}
impl ExactSizeIterator for IntoValues {
#[inline]
fn len(&self) -> usize { self.iter.len() }
}
impl FusedIterator for IntoValues {}delegate_iterator!((IntoValues) => Value);