usecrate::value::Value; use alloc::string::String; use core::borrow::Borrow; use core::fmt::{self, Debug}; use core::hash::Hash; use core::iter::FusedIterator; #[cfg(feature = "preserve_order")] use core::mem; use core::ops; use serde::de;
#[cfg(not(feature = "preserve_order"))] use alloc::collections::{btree_map, BTreeMap}; #[cfg(feature = "preserve_order")] use indexmap::IndexMap;
#[cfg(not(feature = "preserve_order"))] type MapImpl<K, V> = BTreeMap<K, V>; #[cfg(feature = "preserve_order")] type MapImpl<K, V> = IndexMap<K, V>;
impl Map<String, Value> { /// Makes a new empty Map. #[inline] pubfn new() -> Self {
Map {
map: MapImpl::new(),
}
}
/// Makes a new empty Map with the given initial capacity. #[inline] pubfn with_capacity(capacity: usize) -> Self {
Map { #[cfg(not(feature = "preserve_order"))]
map: { // does not support with_capacity let _ = capacity;
BTreeMap::new()
}, #[cfg(feature = "preserve_order")]
map: IndexMap::with_capacity(capacity),
}
}
/// Clears the map, removing all values. #[inline] pubfn clear(&mutself) { self.map.clear();
}
/// Returns a reference to the value corresponding to the key. /// /// The key may be any borrowed form of the map's key type, but the ordering /// on the borrowed form *must* match the ordering on the key type. #[inline] pubfn get<Q>(&self, key: &Q) -> Option<&Value> where
String: Borrow<Q>,
Q: ?Sized + Ord + Eq + Hash,
{ self.map.get(key)
}
/// Returns true if the map contains a value for the specified key. /// /// The key may be any borrowed form of the map's key type, but the ordering /// on the borrowed form *must* match the ordering on the key type. #[inline] pubfn contains_key<Q>(&self, key: &Q) -> bool where
String: Borrow<Q>,
Q: ?Sized + Ord + Eq + Hash,
{ self.map.contains_key(key)
}
/// Returns a mutable reference to the value corresponding to the key. /// /// The key may be any borrowed form of the map's key type, but the ordering /// on the borrowed form *must* match the ordering on the key type. #[inline] pubfn get_mut<Q>(&mutself, key: &Q) -> Option<&mut Value> where
String: Borrow<Q>,
Q: ?Sized + Ord + Eq + Hash,
{ self.map.get_mut(key)
}
/// Returns the key-value pair matching the given key. /// /// The key may be any borrowed form of the map's key type, but the ordering /// on the borrowed form *must* match the ordering on the key type. #[inline] pubfn get_key_value<Q>(&self, key: &Q) -> Option<(&String, &Value)> where
String: Borrow<Q>,
Q: ?Sized + Ord + Eq + Hash,
{ self.map.get_key_value(key)
}
/// Inserts a key-value pair into the map. /// /// If the map did not have this key present, `None` is returned. /// /// If the map did have this key present, the value is updated, and the old /// value is returned. #[inline] pubfn insert(&mutself, k: String, v: Value) -> Option<Value> { self.map.insert(k, v)
}
/// Removes a key from the map, returning the value at the key if the key /// was previously in the map. /// /// The key may be any borrowed form of the map's key type, but the ordering /// on the borrowed form *must* match the ordering on the key type. /// /// If serde_json's "preserve_order" is enabled, `.remove(key)` is /// equivalent to [`.swap_remove(key)`][Self::swap_remove], replacing this /// entry's position with the last element. If you need to preserve the /// relative order of the keys in the map, use /// [`.shift_remove(key)`][Self::shift_remove] instead. #[inline] pubfn remove<Q>(&mutself, key: &Q) -> Option<Value> where
String: Borrow<Q>,
Q: ?Sized + Ord + Eq + Hash,
{ #[cfg(feature = "preserve_order")] returnself.swap_remove(key); #[cfg(not(feature = "preserve_order"))] returnself.map.remove(key);
}
/// Removes a key from the map, returning the stored key and value if the /// key was previously in the map. /// /// The key may be any borrowed form of the map's key type, but the ordering /// on the borrowed form *must* match the ordering on the key type. /// /// If serde_json's "preserve_order" is enabled, `.remove_entry(key)` is /// equivalent to [`.swap_remove_entry(key)`][Self::swap_remove_entry], /// replacing this entry's position with the last element. If you need to /// preserve the relative order of the keys in the map, use /// [`.shift_remove_entry(key)`][Self::shift_remove_entry] instead. #[inline] pubfn remove_entry<Q>(&mutself, key: &Q) -> Option<(String, Value)> where
String: Borrow<Q>,
Q: ?Sized + Ord + Eq + Hash,
{ #[cfg(feature = "preserve_order")] returnself.swap_remove_entry(key); #[cfg(not(feature = "preserve_order"))] returnself.map.remove_entry(key);
}
/// Removes and returns the value corresponding to the key from the map. /// /// Like [`Vec::swap_remove`], the entry is removed by swapping it with the /// last element of the map and popping it off. This perturbs the position /// of what used to be the last element! /// /// [`Vec::swap_remove`]: std::vec::Vec::swap_remove #[cfg(feature = "preserve_order")] #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))] #[inline] pubfn swap_remove<Q>(&mutself, key: &Q) -> Option<Value> where
String: Borrow<Q>,
Q: ?Sized + Ord + Eq + Hash,
{ self.map.swap_remove(key)
}
/// Remove and return the key-value pair. /// /// Like [`Vec::swap_remove`], the entry is removed by swapping it with the /// last element of the map and popping it off. This perturbs the position /// of what used to be the last element! /// /// [`Vec::swap_remove`]: std::vec::Vec::swap_remove #[cfg(feature = "preserve_order")] #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))] #[inline] pubfn swap_remove_entry<Q>(&mutself, key: &Q) -> Option<(String, Value)> where
String: Borrow<Q>,
Q: ?Sized + Ord + Eq + Hash,
{ self.map.swap_remove_entry(key)
}
/// Removes and returns the value corresponding to the key from the map. /// /// Like [`Vec::remove`], the entry is removed by shifting all of the /// elements that follow it, preserving their relative order. This perturbs /// the index of all of those elements! /// /// [`Vec::remove`]: std::vec::Vec::remove #[cfg(feature = "preserve_order")] #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))] #[inline] pubfn shift_remove<Q>(&mutself, key: &Q) -> Option<Value> where
String: Borrow<Q>,
Q: ?Sized + Ord + Eq + Hash,
{ self.map.shift_remove(key)
}
/// Remove and return the key-value pair. /// /// Like [`Vec::remove`], the entry is removed by shifting all of the /// elements that follow it, preserving their relative order. This perturbs /// the index of all of those elements! /// /// [`Vec::remove`]: std::vec::Vec::remove #[cfg(feature = "preserve_order")] #[cfg_attr(docsrs, doc(cfg(feature = "preserve_order")))] #[inline] pubfn shift_remove_entry<Q>(&mutself, key: &Q) -> Option<(String, Value)> where
String: Borrow<Q>,
Q: ?Sized + Ord + Eq + Hash,
{ self.map.shift_remove_entry(key)
}
/// Moves all elements from other into self, leaving other empty. #[inline] pubfn append(&mutself, other: &mutSelf) { #[cfg(feature = "preserve_order")] self.map
.extend(mem::replace(&mut other.map, MapImpl::default())); #[cfg(not(feature = "preserve_order"))] self.map.append(&mut other.map);
}
/// Gets the given key's corresponding entry in the map for in-place /// manipulation. pubfn entry<S>(&mutself, key: S) -> Entry where
S: Into<String>,
{ #[cfg(not(feature = "preserve_order"))] use alloc::collections::btree_map::Entry as EntryImpl; #[cfg(feature = "preserve_order")] use indexmap::map::Entry as EntryImpl;
/// Returns the number of elements in the map. #[inline] pubfn len(&self) -> usize { self.map.len()
}
/// Returns true if the map contains no elements. #[inline] pubfn is_empty(&self) -> bool { self.map.is_empty()
}
/// Gets an iterator over the entries of the map. #[inline] pubfn iter(&self) -> Iter {
Iter {
iter: self.map.iter(),
}
}
/// Gets a mutable iterator over the entries of the map. #[inline] pubfn iter_mut(&mutself) -> IterMut {
IterMut {
iter: self.map.iter_mut(),
}
}
/// Gets an iterator over the keys of the map. #[inline] pubfn keys(&self) -> Keys {
Keys {
iter: self.map.keys(),
}
}
/// Gets an iterator over the values of the map. #[inline] pubfn values(&self) -> Values {
Values {
iter: self.map.values(),
}
}
/// Gets an iterator over mutable values of the map. #[inline] pubfn values_mut(&mutself) -> ValuesMut {
ValuesMut {
iter: self.map.values_mut(),
}
}
/// Retains only the elements specified by the predicate. /// /// In other words, remove all pairs `(k, v)` such that `f(&k, &mut v)` /// returns `false`. #[inline] pubfn retain<F>(&mutself, f: F) where
F: FnMut(&String, &mut Value) -> bool,
{ self.map.retain(f);
}
}
/// Access an element of this map. Panics if the given key is not present in the /// map. /// /// ``` /// # use serde_json::Value; /// # /// # let val = &Value::String("".to_owned()); /// # let _ = /// match val { /// Value::String(s) => Some(s.as_str()), /// Value::Array(arr) => arr[0].as_str(), /// Value::Object(map) => map["type"].as_str(), /// _ => None, /// } /// # ; /// ``` impl<'a, Q> ops::Index<&'a Q> for Map<String, Value> where
String: Borrow<Q>,
Q: ?Sized + Ord + Eq + Hash,
{ type Output = Value;
/// Mutably access an element of this map. Panics if the given key is not /// present in the map. /// /// ``` /// # use serde_json::json; /// # /// # let mut map = serde_json::Map::new(); /// # map.insert("key".to_owned(), serde_json::Value::Null); /// # /// map["key"] = json!("value"); /// ``` impl<'a, Q> ops::IndexMut<&'a Q> for Map<String, Value> where
String: Borrow<Q>,
Q: ?Sized + Ord + Eq + Hash,
{ fn index_mut(&mutself, index: &Q) -> &mut Value { self.map.get_mut(index).expect("no entry found for key")
}
}
/// A view into a single entry in a map, which may either be vacant or occupied. /// This enum is constructed from the [`entry`] method on [`Map`]. /// /// [`entry`]: struct.Map.html#method.entry /// [`Map`]: struct.Map.html pubenum Entry<'a> { /// A vacant Entry.
Vacant(VacantEntry<'a>), /// An occupied Entry.
Occupied(OccupiedEntry<'a>),
}
/// A vacant Entry. It is part of the [`Entry`] enum. /// /// [`Entry`]: enum.Entry.html pubstruct VacantEntry<'a> {
vacant: VacantEntryImpl<'a>,
}
/// An occupied Entry. It is part of the [`Entry`] enum. /// /// [`Entry`]: enum.Entry.html pubstruct OccupiedEntry<'a> {
occupied: OccupiedEntryImpl<'a>,
}
#[cfg(not(feature = "preserve_order"))] type VacantEntryImpl<'a> = btree_map::VacantEntry<'a, String, Value>; #[cfg(feature = "preserve_order")] type VacantEntryImpl<'a> = indexmap::map::VacantEntry<'a, String, Value>;
#[cfg(not(feature = "preserve_order"))] type OccupiedEntryImpl<'a> = btree_map::OccupiedEntry<'a, String, Value>; #[cfg(feature = "preserve_order")] type OccupiedEntryImpl<'a> = indexmap::map::OccupiedEntry<'a, String, Value>;
/// Ensures a value is in the entry by inserting the default if empty, and /// returns a mutable reference to the value in the entry. /// /// # Examples /// /// ``` /// # use serde_json::json; /// # /// let mut map = serde_json::Map::new(); /// map.entry("serde").or_insert(json!(12)); /// /// assert_eq!(map["serde"], 12); /// ``` pubfn or_insert(self, default: Value) -> &'a mut Value { matchself {
Entry::Vacant(entry) => entry.insert(default),
Entry::Occupied(entry) => entry.into_mut(),
}
}
/// Ensures a value is in the entry by inserting the result of the default /// function if empty, and returns a mutable reference to the value in the /// entry. /// /// # Examples /// /// ``` /// # use serde_json::json; /// # /// let mut map = serde_json::Map::new(); /// map.entry("serde").or_insert_with(|| json!("hoho")); /// /// assert_eq!(map["serde"], "hoho".to_owned()); /// ``` pubfn or_insert_with<F>(self, default: F) -> &'a mut Value where
F: FnOnce() -> Value,
{ matchself {
Entry::Vacant(entry) => entry.insert(default()),
Entry::Occupied(entry) => entry.into_mut(),
}
}
impl<'a> VacantEntry<'a> { /// Gets a reference to the key that would be used when inserting a value /// through the VacantEntry. /// /// # Examples /// /// ``` /// use serde_json::map::Entry; /// /// let mut map = serde_json::Map::new(); /// /// match map.entry("serde") { /// Entry::Vacant(vacant) => { /// assert_eq!(vacant.key(), &"serde"); /// } /// Entry::Occupied(_) => unimplemented!(), /// } /// ``` #[inline] pubfn key(&self) -> &String { self.vacant.key()
}
/// Sets the value of the entry with the VacantEntry's key, and returns a /// mutable reference to it. /// /// # Examples /// /// ``` /// # use serde_json::json; /// # /// use serde_json::map::Entry; /// /// let mut map = serde_json::Map::new(); /// /// match map.entry("serde") { /// Entry::Vacant(vacant) => { /// vacant.insert(json!("hoho")); /// } /// Entry::Occupied(_) => unimplemented!(), /// } /// ``` #[inline] pubfn insert(self, value: Value) -> &'a mut Value { self.vacant.insert(value)
}
}
impl<'a> OccupiedEntry<'a> { /// Gets a reference to the key in the entry. /// /// # Examples /// /// ``` /// # use serde_json::json; /// # /// use serde_json::map::Entry; /// /// let mut map = serde_json::Map::new(); /// map.insert("serde".to_owned(), json!(12)); /// /// match map.entry("serde") { /// Entry::Occupied(occupied) => { /// assert_eq!(occupied.key(), &"serde"); /// } /// Entry::Vacant(_) => unimplemented!(), /// } /// ``` #[inline] pubfn key(&self) -> &String { self.occupied.key()
}
/// Gets a reference to the value in the entry. /// /// # Examples /// /// ``` /// # use serde_json::json; /// # /// use serde_json::map::Entry; /// /// let mut map = serde_json::Map::new(); /// map.insert("serde".to_owned(), json!(12)); /// /// match map.entry("serde") { /// Entry::Occupied(occupied) => { /// assert_eq!(occupied.get(), 12); /// } /// Entry::Vacant(_) => unimplemented!(), /// } /// ``` #[inline] pubfn get(&self) -> &Value { self.occupied.get()
}
/// Gets a mutable reference to the value in the entry. /// /// # Examples /// /// ``` /// # use serde_json::json; /// # /// use serde_json::map::Entry; /// /// let mut map = serde_json::Map::new(); /// map.insert("serde".to_owned(), json!([1, 2, 3])); /// /// match map.entry("serde") { /// Entry::Occupied(mut occupied) => { /// occupied.get_mut().as_array_mut().unwrap().push(json!(4)); /// } /// Entry::Vacant(_) => unimplemented!(), /// } /// /// assert_eq!(map["serde"].as_array().unwrap().len(), 4); /// ``` #[inline] pubfn get_mut(&mutself) -> &mut Value { self.occupied.get_mut()
}
/// Converts the entry into a mutable reference to its value. /// /// # Examples /// /// ``` /// # use serde_json::json; /// # /// use serde_json::map::Entry; /// /// let mut map = serde_json::Map::new(); /// map.insert("serde".to_owned(), json!([1, 2, 3])); /// /// match map.entry("serde") { /// Entry::Occupied(mut occupied) => { /// occupied.into_mut().as_array_mut().unwrap().push(json!(4)); /// } /// Entry::Vacant(_) => unimplemented!(), /// } /// /// assert_eq!(map["serde"].as_array().unwrap().len(), 4); /// ``` #[inline] pubfn into_mut(self) -> &'a mut Value { self.occupied.into_mut()
}
/// Sets the value of the entry with the `OccupiedEntry`'s key, and returns /// the entry's old value. /// /// # Examples /// /// ``` /// # use serde_json::json; /// # /// use serde_json::map::Entry; /// /// let mut map = serde_json::Map::new(); /// map.insert("serde".to_owned(), json!(12)); /// /// match map.entry("serde") { /// Entry::Occupied(mut occupied) => { /// assert_eq!(occupied.insert(json!(13)), 12); /// assert_eq!(occupied.get(), 13); /// } /// Entry::Vacant(_) => unimplemented!(), /// } /// ``` #[inline] pubfn insert(&mutself, value: Value) -> Value { self.occupied.insert(value)
}
/// Takes the value of the entry out of the map, and returns it. /// /// # Examples /// /// ``` /// # use serde_json::json; /// # /// use serde_json::map::Entry; /// /// let mut map = serde_json::Map::new(); /// map.insert("serde".to_owned(), json!(12)); /// /// match map.entry("serde") { /// Entry::Occupied(occupied) => { /// assert_eq!(occupied.remove(), 12); /// } /// Entry::Vacant(_) => unimplemented!(), /// } /// ``` #[inline] pubfn remove(self) -> Value { #[cfg(feature = "preserve_order")] returnself.occupied.swap_remove(); #[cfg(not(feature = "preserve_order"))] returnself.occupied.remove();
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.