• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! A map of String to serde_json::Value.
2 //!
3 //! By default the map is backed by a [`BTreeMap`]. Enable the `preserve_order`
4 //! feature of serde_json to use [`IndexMap`] instead.
5 //!
6 //! [`BTreeMap`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html
7 //! [`IndexMap`]: https://docs.rs/indexmap/*/indexmap/map/struct.IndexMap.html
8 
9 use crate::lib::borrow::Borrow;
10 use crate::lib::iter::FromIterator;
11 use crate::lib::*;
12 use crate::value::Value;
13 use serde::de;
14 
15 #[cfg(feature = "preserve_order")]
16 use indexmap::{self, IndexMap};
17 
18 /// Represents a JSON key/value type.
19 pub struct Map<K, V> {
20     map: MapImpl<K, V>,
21 }
22 
23 #[cfg(not(feature = "preserve_order"))]
24 type MapImpl<K, V> = BTreeMap<K, V>;
25 #[cfg(feature = "preserve_order")]
26 type MapImpl<K, V> = IndexMap<K, V>;
27 
28 impl Map<String, Value> {
29     /// Makes a new empty Map.
30     #[inline]
new() -> Self31     pub fn new() -> Self {
32         Map {
33             map: MapImpl::new(),
34         }
35     }
36 
37     /// Makes a new empty Map with the given initial capacity.
38     #[inline]
with_capacity(capacity: usize) -> Self39     pub fn with_capacity(capacity: usize) -> Self {
40         Map {
41             #[cfg(not(feature = "preserve_order"))]
42             map: {
43                 // does not support with_capacity
44                 let _ = capacity;
45                 BTreeMap::new()
46             },
47             #[cfg(feature = "preserve_order")]
48             map: IndexMap::with_capacity(capacity),
49         }
50     }
51 
52     /// Clears the map, removing all values.
53     #[inline]
clear(&mut self)54     pub fn clear(&mut self) {
55         self.map.clear()
56     }
57 
58     /// Returns a reference to the value corresponding to the key.
59     ///
60     /// The key may be any borrowed form of the map's key type, but the ordering
61     /// on the borrowed form *must* match the ordering on the key type.
62     #[inline]
get<Q>(&self, key: &Q) -> Option<&Value> where String: Borrow<Q>, Q: ?Sized + Ord + Eq + Hash,63     pub fn get<Q>(&self, key: &Q) -> Option<&Value>
64     where
65         String: Borrow<Q>,
66         Q: ?Sized + Ord + Eq + Hash,
67     {
68         self.map.get(key)
69     }
70 
71     /// Returns true if the map contains a value for the specified key.
72     ///
73     /// The key may be any borrowed form of the map's key type, but the ordering
74     /// on the borrowed form *must* match the ordering on the key type.
75     #[inline]
contains_key<Q>(&self, key: &Q) -> bool where String: Borrow<Q>, Q: ?Sized + Ord + Eq + Hash,76     pub fn contains_key<Q>(&self, key: &Q) -> bool
77     where
78         String: Borrow<Q>,
79         Q: ?Sized + Ord + Eq + Hash,
80     {
81         self.map.contains_key(key)
82     }
83 
84     /// Returns a mutable reference to the value corresponding to the key.
85     ///
86     /// The key may be any borrowed form of the map's key type, but the ordering
87     /// on the borrowed form *must* match the ordering on the key type.
88     #[inline]
get_mut<Q>(&mut self, key: &Q) -> Option<&mut Value> where String: Borrow<Q>, Q: ?Sized + Ord + Eq + Hash,89     pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut Value>
90     where
91         String: Borrow<Q>,
92         Q: ?Sized + Ord + Eq + Hash,
93     {
94         self.map.get_mut(key)
95     }
96 
97     /// Inserts a key-value pair into the map.
98     ///
99     /// If the map did not have this key present, `None` is returned.
100     ///
101     /// If the map did have this key present, the value is updated, and the old
102     /// value is returned.
103     #[inline]
insert(&mut self, k: String, v: Value) -> Option<Value>104     pub fn insert(&mut self, k: String, v: Value) -> Option<Value> {
105         self.map.insert(k, v)
106     }
107 
108     /// Removes a key from the map, returning the value at the key if the key
109     /// was previously in the map.
110     ///
111     /// The key may be any borrowed form of the map's key type, but the ordering
112     /// on the borrowed form *must* match the ordering on the key type.
113     #[inline]
remove<Q>(&mut self, key: &Q) -> Option<Value> where String: Borrow<Q>, Q: ?Sized + Ord + Eq + Hash,114     pub fn remove<Q>(&mut self, key: &Q) -> Option<Value>
115     where
116         String: Borrow<Q>,
117         Q: ?Sized + Ord + Eq + Hash,
118     {
119         #[cfg(feature = "preserve_order")]
120         return self.map.swap_remove(key);
121         #[cfg(not(feature = "preserve_order"))]
122         return self.map.remove(key);
123     }
124 
125     /// Removes a key from the map, returning the stored key and value if the
126     /// key was previously in the map.
127     ///
128     /// The key may be any borrowed form of the map's key type, but the ordering
129     /// on the borrowed form *must* match the ordering on the key type.
remove_entry<Q>(&mut self, key: &Q) -> Option<(String, Value)> where String: Borrow<Q>, Q: ?Sized + Ord + Eq + Hash,130     pub fn remove_entry<Q>(&mut self, key: &Q) -> Option<(String, Value)>
131     where
132         String: Borrow<Q>,
133         Q: ?Sized + Ord + Eq + Hash,
134     {
135         #[cfg(any(feature = "preserve_order", not(no_btreemap_remove_entry)))]
136         return self.map.remove_entry(key);
137         #[cfg(all(
138             not(feature = "preserve_order"),
139             no_btreemap_remove_entry,
140             not(no_btreemap_get_key_value),
141         ))]
142         {
143             let (key, _value) = self.map.get_key_value(key)?;
144             let key = key.clone();
145             let value = self.map.remove::<String>(&key)?;
146             Some((key, value))
147         }
148         #[cfg(all(
149             not(feature = "preserve_order"),
150             no_btreemap_remove_entry,
151             no_btreemap_get_key_value,
152         ))]
153         {
154             struct Key<'a, Q: ?Sized>(&'a Q);
155 
156             impl<'a, Q: ?Sized> RangeBounds<Q> for Key<'a, Q> {
157                 fn start_bound(&self) -> Bound<&Q> {
158                     Bound::Included(self.0)
159                 }
160                 fn end_bound(&self) -> Bound<&Q> {
161                     Bound::Included(self.0)
162                 }
163             }
164 
165             let mut range = self.map.range(Key(key));
166             let (key, _value) = range.next()?;
167             let key = key.clone();
168             let value = self.map.remove::<String>(&key)?;
169             Some((key, value))
170         }
171     }
172 
173     /// Moves all elements from other into Self, leaving other empty.
174     #[inline]
append(&mut self, other: &mut Self)175     pub fn append(&mut self, other: &mut Self) {
176         #[cfg(feature = "preserve_order")]
177         for (k, v) in mem::replace(&mut other.map, MapImpl::default()) {
178             self.map.insert(k, v);
179         }
180         #[cfg(not(feature = "preserve_order"))]
181         self.map.append(&mut other.map);
182     }
183 
184     /// Gets the given key's corresponding entry in the map for in-place
185     /// manipulation.
entry<S>(&mut self, key: S) -> Entry where S: Into<String>,186     pub fn entry<S>(&mut self, key: S) -> Entry
187     where
188         S: Into<String>,
189     {
190         #[cfg(not(feature = "preserve_order"))]
191         use crate::lib::btree_map::Entry as EntryImpl;
192         #[cfg(feature = "preserve_order")]
193         use indexmap::map::Entry as EntryImpl;
194 
195         match self.map.entry(key.into()) {
196             EntryImpl::Vacant(vacant) => Entry::Vacant(VacantEntry { vacant }),
197             EntryImpl::Occupied(occupied) => Entry::Occupied(OccupiedEntry { occupied }),
198         }
199     }
200 
201     /// Returns the number of elements in the map.
202     #[inline]
len(&self) -> usize203     pub fn len(&self) -> usize {
204         self.map.len()
205     }
206 
207     /// Returns true if the map contains no elements.
208     #[inline]
is_empty(&self) -> bool209     pub fn is_empty(&self) -> bool {
210         self.map.is_empty()
211     }
212 
213     /// Gets an iterator over the entries of the map.
214     #[inline]
iter(&self) -> Iter215     pub fn iter(&self) -> Iter {
216         Iter {
217             iter: self.map.iter(),
218         }
219     }
220 
221     /// Gets a mutable iterator over the entries of the map.
222     #[inline]
iter_mut(&mut self) -> IterMut223     pub fn iter_mut(&mut self) -> IterMut {
224         IterMut {
225             iter: self.map.iter_mut(),
226         }
227     }
228 
229     /// Gets an iterator over the keys of the map.
230     #[inline]
keys(&self) -> Keys231     pub fn keys(&self) -> Keys {
232         Keys {
233             iter: self.map.keys(),
234         }
235     }
236 
237     /// Gets an iterator over the values of the map.
238     #[inline]
values(&self) -> Values239     pub fn values(&self) -> Values {
240         Values {
241             iter: self.map.values(),
242         }
243     }
244 
245     /// Gets an iterator over mutable values of the map.
246     #[inline]
values_mut(&mut self) -> ValuesMut247     pub fn values_mut(&mut self) -> ValuesMut {
248         ValuesMut {
249             iter: self.map.values_mut(),
250         }
251     }
252 }
253 
254 impl Default for Map<String, Value> {
255     #[inline]
default() -> Self256     fn default() -> Self {
257         Map {
258             map: MapImpl::new(),
259         }
260     }
261 }
262 
263 impl Clone for Map<String, Value> {
264     #[inline]
clone(&self) -> Self265     fn clone(&self) -> Self {
266         Map {
267             map: self.map.clone(),
268         }
269     }
270 }
271 
272 impl PartialEq for Map<String, Value> {
273     #[inline]
eq(&self, other: &Self) -> bool274     fn eq(&self, other: &Self) -> bool {
275         self.map.eq(&other.map)
276     }
277 }
278 
279 impl Eq for Map<String, Value> {}
280 
281 /// Access an element of this map. Panics if the given key is not present in the
282 /// map.
283 ///
284 /// ```
285 /// # use serde_json::Value;
286 /// #
287 /// # let val = &Value::String("".to_owned());
288 /// # let _ =
289 /// match *val {
290 ///     Value::String(ref s) => Some(s.as_str()),
291 ///     Value::Array(ref arr) => arr[0].as_str(),
292 ///     Value::Object(ref map) => map["type"].as_str(),
293 ///     _ => None,
294 /// }
295 /// # ;
296 /// ```
297 impl<'a, Q> ops::Index<&'a Q> for Map<String, Value>
298 where
299     String: Borrow<Q>,
300     Q: ?Sized + Ord + Eq + Hash,
301 {
302     type Output = Value;
303 
index(&self, index: &Q) -> &Value304     fn index(&self, index: &Q) -> &Value {
305         self.map.index(index)
306     }
307 }
308 
309 /// Mutably access an element of this map. Panics if the given key is not
310 /// present in the map.
311 ///
312 /// ```
313 /// # use serde_json::json;
314 /// #
315 /// # let mut map = serde_json::Map::new();
316 /// # map.insert("key".to_owned(), serde_json::Value::Null);
317 /// #
318 /// map["key"] = json!("value");
319 /// ```
320 impl<'a, Q> ops::IndexMut<&'a Q> for Map<String, Value>
321 where
322     String: Borrow<Q>,
323     Q: ?Sized + Ord + Eq + Hash,
324 {
index_mut(&mut self, index: &Q) -> &mut Value325     fn index_mut(&mut self, index: &Q) -> &mut Value {
326         self.map.get_mut(index).expect("no entry found for key")
327     }
328 }
329 
330 impl Debug for Map<String, Value> {
331     #[inline]
fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error>332     fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> {
333         self.map.fmt(formatter)
334     }
335 }
336 
337 #[cfg(any(feature = "std", feature = "alloc"))]
338 impl serde::ser::Serialize for Map<String, Value> {
339     #[inline]
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::ser::Serializer,340     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
341     where
342         S: serde::ser::Serializer,
343     {
344         use serde::ser::SerializeMap;
345         let mut map = tri!(serializer.serialize_map(Some(self.len())));
346         for (k, v) in self {
347             tri!(map.serialize_entry(k, v));
348         }
349         map.end()
350     }
351 }
352 
353 impl<'de> de::Deserialize<'de> for Map<String, Value> {
354     #[inline]
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: de::Deserializer<'de>,355     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
356     where
357         D: de::Deserializer<'de>,
358     {
359         struct Visitor;
360 
361         impl<'de> de::Visitor<'de> for Visitor {
362             type Value = Map<String, Value>;
363 
364             fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
365                 formatter.write_str("a map")
366             }
367 
368             #[inline]
369             fn visit_unit<E>(self) -> Result<Self::Value, E>
370             where
371                 E: de::Error,
372             {
373                 Ok(Map::new())
374             }
375 
376             #[cfg(any(feature = "std", feature = "alloc"))]
377             #[inline]
378             fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
379             where
380                 V: de::MapAccess<'de>,
381             {
382                 let mut values = Map::new();
383 
384                 while let Some((key, value)) = tri!(visitor.next_entry()) {
385                     values.insert(key, value);
386                 }
387 
388                 Ok(values)
389             }
390         }
391 
392         deserializer.deserialize_map(Visitor)
393     }
394 }
395 
396 impl FromIterator<(String, Value)> for Map<String, Value> {
from_iter<T>(iter: T) -> Self where T: IntoIterator<Item = (String, Value)>,397     fn from_iter<T>(iter: T) -> Self
398     where
399         T: IntoIterator<Item = (String, Value)>,
400     {
401         Map {
402             map: FromIterator::from_iter(iter),
403         }
404     }
405 }
406 
407 impl Extend<(String, Value)> for Map<String, Value> {
extend<T>(&mut self, iter: T) where T: IntoIterator<Item = (String, Value)>,408     fn extend<T>(&mut self, iter: T)
409     where
410         T: IntoIterator<Item = (String, Value)>,
411     {
412         self.map.extend(iter);
413     }
414 }
415 
416 macro_rules! delegate_iterator {
417     (($name:ident $($generics:tt)*) => $item:ty) => {
418         impl $($generics)* Iterator for $name $($generics)* {
419             type Item = $item;
420             #[inline]
421             fn next(&mut self) -> Option<Self::Item> {
422                 self.iter.next()
423             }
424             #[inline]
425             fn size_hint(&self) -> (usize, Option<usize>) {
426                 self.iter.size_hint()
427             }
428         }
429 
430         impl $($generics)* DoubleEndedIterator for $name $($generics)* {
431             #[inline]
432             fn next_back(&mut self) -> Option<Self::Item> {
433                 self.iter.next_back()
434             }
435         }
436 
437         impl $($generics)* ExactSizeIterator for $name $($generics)* {
438             #[inline]
439             fn len(&self) -> usize {
440                 self.iter.len()
441             }
442         }
443 
444         impl $($generics)* FusedIterator for $name $($generics)* {}
445     }
446 }
447 
448 //////////////////////////////////////////////////////////////////////////////
449 
450 /// A view into a single entry in a map, which may either be vacant or occupied.
451 /// This enum is constructed from the [`entry`] method on [`Map`].
452 ///
453 /// [`entry`]: struct.Map.html#method.entry
454 /// [`Map`]: struct.Map.html
455 pub enum Entry<'a> {
456     /// A vacant Entry.
457     Vacant(VacantEntry<'a>),
458     /// An occupied Entry.
459     Occupied(OccupiedEntry<'a>),
460 }
461 
462 /// A vacant Entry. It is part of the [`Entry`] enum.
463 ///
464 /// [`Entry`]: enum.Entry.html
465 pub struct VacantEntry<'a> {
466     vacant: VacantEntryImpl<'a>,
467 }
468 
469 /// An occupied Entry. It is part of the [`Entry`] enum.
470 ///
471 /// [`Entry`]: enum.Entry.html
472 pub struct OccupiedEntry<'a> {
473     occupied: OccupiedEntryImpl<'a>,
474 }
475 
476 #[cfg(not(feature = "preserve_order"))]
477 type VacantEntryImpl<'a> = btree_map::VacantEntry<'a, String, Value>;
478 #[cfg(feature = "preserve_order")]
479 type VacantEntryImpl<'a> = indexmap::map::VacantEntry<'a, String, Value>;
480 
481 #[cfg(not(feature = "preserve_order"))]
482 type OccupiedEntryImpl<'a> = btree_map::OccupiedEntry<'a, String, Value>;
483 #[cfg(feature = "preserve_order")]
484 type OccupiedEntryImpl<'a> = indexmap::map::OccupiedEntry<'a, String, Value>;
485 
486 impl<'a> Entry<'a> {
487     /// Returns a reference to this entry's key.
488     ///
489     /// # Examples
490     ///
491     /// ```
492     /// let mut map = serde_json::Map::new();
493     /// assert_eq!(map.entry("serde").key(), &"serde");
494     /// ```
key(&self) -> &String495     pub fn key(&self) -> &String {
496         match *self {
497             Entry::Vacant(ref e) => e.key(),
498             Entry::Occupied(ref e) => e.key(),
499         }
500     }
501 
502     /// Ensures a value is in the entry by inserting the default if empty, and
503     /// returns a mutable reference to the value in the entry.
504     ///
505     /// # Examples
506     ///
507     /// ```
508     /// # use serde_json::json;
509     /// #
510     /// let mut map = serde_json::Map::new();
511     /// map.entry("serde").or_insert(json!(12));
512     ///
513     /// assert_eq!(map["serde"], 12);
514     /// ```
or_insert(self, default: Value) -> &'a mut Value515     pub fn or_insert(self, default: Value) -> &'a mut Value {
516         match self {
517             Entry::Vacant(entry) => entry.insert(default),
518             Entry::Occupied(entry) => entry.into_mut(),
519         }
520     }
521 
522     /// Ensures a value is in the entry by inserting the result of the default
523     /// function if empty, and returns a mutable reference to the value in the
524     /// entry.
525     ///
526     /// # Examples
527     ///
528     /// ```
529     /// # use serde_json::json;
530     /// #
531     /// let mut map = serde_json::Map::new();
532     /// map.entry("serde").or_insert_with(|| json!("hoho"));
533     ///
534     /// assert_eq!(map["serde"], "hoho".to_owned());
535     /// ```
or_insert_with<F>(self, default: F) -> &'a mut Value where F: FnOnce() -> Value,536     pub fn or_insert_with<F>(self, default: F) -> &'a mut Value
537     where
538         F: FnOnce() -> Value,
539     {
540         match self {
541             Entry::Vacant(entry) => entry.insert(default()),
542             Entry::Occupied(entry) => entry.into_mut(),
543         }
544     }
545 }
546 
547 impl<'a> VacantEntry<'a> {
548     /// Gets a reference to the key that would be used when inserting a value
549     /// through the VacantEntry.
550     ///
551     /// # Examples
552     ///
553     /// ```
554     /// use serde_json::map::Entry;
555     ///
556     /// let mut map = serde_json::Map::new();
557     ///
558     /// match map.entry("serde") {
559     ///     Entry::Vacant(vacant) => {
560     ///         assert_eq!(vacant.key(), &"serde");
561     ///     }
562     ///     Entry::Occupied(_) => unimplemented!(),
563     /// }
564     /// ```
565     #[inline]
key(&self) -> &String566     pub fn key(&self) -> &String {
567         self.vacant.key()
568     }
569 
570     /// Sets the value of the entry with the VacantEntry's key, and returns a
571     /// mutable reference to it.
572     ///
573     /// # Examples
574     ///
575     /// ```
576     /// # use serde_json::json;
577     /// #
578     /// use serde_json::map::Entry;
579     ///
580     /// let mut map = serde_json::Map::new();
581     ///
582     /// match map.entry("serde") {
583     ///     Entry::Vacant(vacant) => {
584     ///         vacant.insert(json!("hoho"));
585     ///     }
586     ///     Entry::Occupied(_) => unimplemented!(),
587     /// }
588     /// ```
589     #[inline]
insert(self, value: Value) -> &'a mut Value590     pub fn insert(self, value: Value) -> &'a mut Value {
591         self.vacant.insert(value)
592     }
593 }
594 
595 impl<'a> OccupiedEntry<'a> {
596     /// Gets a reference to the key in the entry.
597     ///
598     /// # Examples
599     ///
600     /// ```
601     /// # use serde_json::json;
602     /// #
603     /// use serde_json::map::Entry;
604     ///
605     /// let mut map = serde_json::Map::new();
606     /// map.insert("serde".to_owned(), json!(12));
607     ///
608     /// match map.entry("serde") {
609     ///     Entry::Occupied(occupied) => {
610     ///         assert_eq!(occupied.key(), &"serde");
611     ///     }
612     ///     Entry::Vacant(_) => unimplemented!(),
613     /// }
614     /// ```
615     #[inline]
key(&self) -> &String616     pub fn key(&self) -> &String {
617         self.occupied.key()
618     }
619 
620     /// Gets a reference to the value in the entry.
621     ///
622     /// # Examples
623     ///
624     /// ```
625     /// # use serde_json::json;
626     /// #
627     /// use serde_json::map::Entry;
628     ///
629     /// let mut map = serde_json::Map::new();
630     /// map.insert("serde".to_owned(), json!(12));
631     ///
632     /// match map.entry("serde") {
633     ///     Entry::Occupied(occupied) => {
634     ///         assert_eq!(occupied.get(), 12);
635     ///     }
636     ///     Entry::Vacant(_) => unimplemented!(),
637     /// }
638     /// ```
639     #[inline]
get(&self) -> &Value640     pub fn get(&self) -> &Value {
641         self.occupied.get()
642     }
643 
644     /// Gets a mutable reference to the value in the entry.
645     ///
646     /// # Examples
647     ///
648     /// ```
649     /// # use serde_json::json;
650     /// #
651     /// use serde_json::map::Entry;
652     ///
653     /// let mut map = serde_json::Map::new();
654     /// map.insert("serde".to_owned(), json!([1, 2, 3]));
655     ///
656     /// match map.entry("serde") {
657     ///     Entry::Occupied(mut occupied) => {
658     ///         occupied.get_mut().as_array_mut().unwrap().push(json!(4));
659     ///     }
660     ///     Entry::Vacant(_) => unimplemented!(),
661     /// }
662     ///
663     /// assert_eq!(map["serde"].as_array().unwrap().len(), 4);
664     /// ```
665     #[inline]
get_mut(&mut self) -> &mut Value666     pub fn get_mut(&mut self) -> &mut Value {
667         self.occupied.get_mut()
668     }
669 
670     /// Converts the entry into a mutable reference to its value.
671     ///
672     /// # Examples
673     ///
674     /// ```
675     /// # use serde_json::json;
676     /// #
677     /// use serde_json::map::Entry;
678     ///
679     /// let mut map = serde_json::Map::new();
680     /// map.insert("serde".to_owned(), json!([1, 2, 3]));
681     ///
682     /// match map.entry("serde") {
683     ///     Entry::Occupied(mut occupied) => {
684     ///         occupied.into_mut().as_array_mut().unwrap().push(json!(4));
685     ///     }
686     ///     Entry::Vacant(_) => unimplemented!(),
687     /// }
688     ///
689     /// assert_eq!(map["serde"].as_array().unwrap().len(), 4);
690     /// ```
691     #[inline]
into_mut(self) -> &'a mut Value692     pub fn into_mut(self) -> &'a mut Value {
693         self.occupied.into_mut()
694     }
695 
696     /// Sets the value of the entry with the `OccupiedEntry`'s key, and returns
697     /// the entry's old value.
698     ///
699     /// # Examples
700     ///
701     /// ```
702     /// # use serde_json::json;
703     /// #
704     /// use serde_json::map::Entry;
705     ///
706     /// let mut map = serde_json::Map::new();
707     /// map.insert("serde".to_owned(), json!(12));
708     ///
709     /// match map.entry("serde") {
710     ///     Entry::Occupied(mut occupied) => {
711     ///         assert_eq!(occupied.insert(json!(13)), 12);
712     ///         assert_eq!(occupied.get(), 13);
713     ///     }
714     ///     Entry::Vacant(_) => unimplemented!(),
715     /// }
716     /// ```
717     #[inline]
insert(&mut self, value: Value) -> Value718     pub fn insert(&mut self, value: Value) -> Value {
719         self.occupied.insert(value)
720     }
721 
722     /// Takes the value of the entry out of the map, and returns it.
723     ///
724     /// # Examples
725     ///
726     /// ```
727     /// # use serde_json::json;
728     /// #
729     /// use serde_json::map::Entry;
730     ///
731     /// let mut map = serde_json::Map::new();
732     /// map.insert("serde".to_owned(), json!(12));
733     ///
734     /// match map.entry("serde") {
735     ///     Entry::Occupied(occupied) => {
736     ///         assert_eq!(occupied.remove(), 12);
737     ///     }
738     ///     Entry::Vacant(_) => unimplemented!(),
739     /// }
740     /// ```
741     #[inline]
remove(self) -> Value742     pub fn remove(self) -> Value {
743         #[cfg(feature = "preserve_order")]
744         return self.occupied.swap_remove();
745         #[cfg(not(feature = "preserve_order"))]
746         return self.occupied.remove();
747     }
748 }
749 
750 //////////////////////////////////////////////////////////////////////////////
751 
752 impl<'a> IntoIterator for &'a Map<String, Value> {
753     type Item = (&'a String, &'a Value);
754     type IntoIter = Iter<'a>;
755     #[inline]
into_iter(self) -> Self::IntoIter756     fn into_iter(self) -> Self::IntoIter {
757         Iter {
758             iter: self.map.iter(),
759         }
760     }
761 }
762 
763 /// An iterator over a serde_json::Map's entries.
764 pub struct Iter<'a> {
765     iter: IterImpl<'a>,
766 }
767 
768 #[cfg(not(feature = "preserve_order"))]
769 type IterImpl<'a> = btree_map::Iter<'a, String, Value>;
770 #[cfg(feature = "preserve_order")]
771 type IterImpl<'a> = indexmap::map::Iter<'a, String, Value>;
772 
773 delegate_iterator!((Iter<'a>) => (&'a String, &'a Value));
774 
775 //////////////////////////////////////////////////////////////////////////////
776 
777 impl<'a> IntoIterator for &'a mut Map<String, Value> {
778     type Item = (&'a String, &'a mut Value);
779     type IntoIter = IterMut<'a>;
780     #[inline]
into_iter(self) -> Self::IntoIter781     fn into_iter(self) -> Self::IntoIter {
782         IterMut {
783             iter: self.map.iter_mut(),
784         }
785     }
786 }
787 
788 /// A mutable iterator over a serde_json::Map's entries.
789 pub struct IterMut<'a> {
790     iter: IterMutImpl<'a>,
791 }
792 
793 #[cfg(not(feature = "preserve_order"))]
794 type IterMutImpl<'a> = btree_map::IterMut<'a, String, Value>;
795 #[cfg(feature = "preserve_order")]
796 type IterMutImpl<'a> = indexmap::map::IterMut<'a, String, Value>;
797 
798 delegate_iterator!((IterMut<'a>) => (&'a String, &'a mut Value));
799 
800 //////////////////////////////////////////////////////////////////////////////
801 
802 impl IntoIterator for Map<String, Value> {
803     type Item = (String, Value);
804     type IntoIter = IntoIter;
805     #[inline]
into_iter(self) -> Self::IntoIter806     fn into_iter(self) -> Self::IntoIter {
807         IntoIter {
808             iter: self.map.into_iter(),
809         }
810     }
811 }
812 
813 /// An owning iterator over a serde_json::Map's entries.
814 pub struct IntoIter {
815     iter: IntoIterImpl,
816 }
817 
818 #[cfg(not(feature = "preserve_order"))]
819 type IntoIterImpl = btree_map::IntoIter<String, Value>;
820 #[cfg(feature = "preserve_order")]
821 type IntoIterImpl = indexmap::map::IntoIter<String, Value>;
822 
823 delegate_iterator!((IntoIter) => (String, Value));
824 
825 //////////////////////////////////////////////////////////////////////////////
826 
827 /// An iterator over a serde_json::Map's keys.
828 pub struct Keys<'a> {
829     iter: KeysImpl<'a>,
830 }
831 
832 #[cfg(not(feature = "preserve_order"))]
833 type KeysImpl<'a> = btree_map::Keys<'a, String, Value>;
834 #[cfg(feature = "preserve_order")]
835 type KeysImpl<'a> = indexmap::map::Keys<'a, String, Value>;
836 
837 delegate_iterator!((Keys<'a>) => &'a String);
838 
839 //////////////////////////////////////////////////////////////////////////////
840 
841 /// An iterator over a serde_json::Map's values.
842 pub struct Values<'a> {
843     iter: ValuesImpl<'a>,
844 }
845 
846 #[cfg(not(feature = "preserve_order"))]
847 type ValuesImpl<'a> = btree_map::Values<'a, String, Value>;
848 #[cfg(feature = "preserve_order")]
849 type ValuesImpl<'a> = indexmap::map::Values<'a, String, Value>;
850 
851 delegate_iterator!((Values<'a>) => &'a Value);
852 
853 //////////////////////////////////////////////////////////////////////////////
854 
855 /// A mutable iterator over a serde_json::Map's values.
856 pub struct ValuesMut<'a> {
857     iter: ValuesMutImpl<'a>,
858 }
859 
860 #[cfg(not(feature = "preserve_order"))]
861 type ValuesMutImpl<'a> = btree_map::ValuesMut<'a, String, Value>;
862 #[cfg(feature = "preserve_order")]
863 type ValuesMutImpl<'a> = indexmap::map::ValuesMut<'a, String, Value>;
864 
865 delegate_iterator!((ValuesMut<'a>) => &'a mut Value);
866