pub enum Entry<'a, K, V, S, A = Global>where
A: Allocator,{
Occupied(OccupiedEntry<'a, K, V, S, A>),
Vacant(VacantEntry<'a, K, V, S, A>),
}
Expand description
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 HashMap
.
§Examples
use hashbrown::hash_map::{Entry, HashMap, OccupiedEntry};
let mut map = HashMap::new();
map.extend([("a", 10), ("b", 20), ("c", 30)]);
assert_eq!(map.len(), 3);
// Existing key (insert)
let entry: Entry<_, _, _> = map.entry("a");
let _raw_o: OccupiedEntry<_, _, _> = entry.insert(1);
assert_eq!(map.len(), 3);
// Nonexistent key (insert)
map.entry("d").insert(4);
// Existing key (or_insert)
let v = map.entry("b").or_insert(2);
assert_eq!(std::mem::replace(v, 2), 20);
// Nonexistent key (or_insert)
map.entry("e").or_insert(5);
// Existing key (or_insert_with)
let v = map.entry("c").or_insert_with(|| 3);
assert_eq!(std::mem::replace(v, 3), 30);
// Nonexistent key (or_insert_with)
map.entry("f").or_insert_with(|| 6);
println!("Our HashMap: {:?}", map);
let mut vec: Vec<_> = map.iter().map(|(&k, &v)| (k, v)).collect();
// The `Iter` iterator produces items in arbitrary order, so the
// items must be sorted to test them against a sorted array.
vec.sort_unstable();
assert_eq!(vec, [("a", 1), ("b", 2), ("c", 3), ("d", 4), ("e", 5), ("f", 6)]);
Variants§
Occupied(OccupiedEntry<'a, K, V, S, A>)
An occupied entry.
§Examples
use hashbrown::hash_map::{Entry, HashMap};
let mut map: HashMap<_, _> = [("a", 100), ("b", 200)].into();
match map.entry("a") {
Entry::Vacant(_) => unreachable!(),
Entry::Occupied(_) => { }
}
Vacant(VacantEntry<'a, K, V, S, A>)
A vacant entry.
§Examples
use hashbrown::hash_map::{Entry, HashMap};
let mut map: HashMap<&str, i32> = HashMap::new();
match map.entry("a") {
Entry::Occupied(_) => unreachable!(),
Entry::Vacant(_) => { }
}
Implementations§
§impl<'a, K, V, S, A> Entry<'a, K, V, S, A>where
A: Allocator,
impl<'a, K, V, S, A> Entry<'a, K, V, S, A>where
A: Allocator,
pub fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S, A>where
K: Hash,
S: BuildHasher,
pub fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S, A>where
K: Hash,
S: BuildHasher,
Sets the value of the entry, and returns an OccupiedEntry.
§Examples
use hashbrown::HashMap;
let mut map: HashMap<&str, u32> = HashMap::new();
let entry = map.entry("horseyland").insert(37);
assert_eq!(entry.key(), &"horseyland");
pub fn or_insert(self, default: V) -> &'a mut Vwhere
K: Hash,
S: BuildHasher,
pub fn or_insert(self, default: V) -> &'a mut Vwhere
K: Hash,
S: BuildHasher,
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 hashbrown::HashMap;
let mut map: HashMap<&str, u32> = HashMap::new();
// nonexistent key
map.entry("poneyland").or_insert(3);
assert_eq!(map["poneyland"], 3);
// existing key
*map.entry("poneyland").or_insert(10) *= 2;
assert_eq!(map["poneyland"], 6);
Examples found in repository?
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
fn contributors() -> Result<Contributors, LoadContributorsError> {
let manifest_dir = std::env::var("CARGO_MANIFEST_DIR")?;
let mut cmd = std::process::Command::new("git")
.args(["--no-pager", "log", "--pretty=format:%an"])
.current_dir(manifest_dir)
.stdout(Stdio::piped())
.spawn()?;
let stdout = cmd.stdout.take().ok_or(LoadContributorsError::Stdout)?;
// Take the list of commit author names and collect them into a HashMap,
// keeping a count of how many commits they authored.
let contributors = BufReader::new(stdout).lines().map_while(Result::ok).fold(
HashMap::new(),
|mut acc, word| {
*acc.entry(word).or_insert(0) += 1;
acc
},
);
Ok(contributors)
}
pub fn or_insert_with<F>(self, default: F) -> &'a mut V
pub fn or_insert_with<F>(self, default: F) -> &'a mut V
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 hashbrown::HashMap;
let mut map: HashMap<&str, u32> = HashMap::new();
// nonexistent key
map.entry("poneyland").or_insert_with(|| 3);
assert_eq!(map["poneyland"], 3);
// existing key
*map.entry("poneyland").or_insert_with(|| 10) *= 2;
assert_eq!(map["poneyland"], 6);
pub fn or_insert_with_key<F>(self, default: F) -> &'a mut V
pub fn or_insert_with_key<F>(self, default: F) -> &'a mut V
Ensures a value is in the entry by inserting, if empty, the result of the default function.
This method allows for generating key-derived values for insertion by providing the default
function a reference to the key that was moved during the .entry(key)
method call.
The reference to the moved key is provided so that cloning or copying the key is
unnecessary, unlike with .or_insert_with(|| ... )
.
§Examples
use hashbrown::HashMap;
let mut map: HashMap<&str, usize> = HashMap::new();
// nonexistent key
map.entry("poneyland").or_insert_with_key(|key| key.chars().count());
assert_eq!(map["poneyland"], 9);
// existing key
*map.entry("poneyland").or_insert_with_key(|key| key.chars().count() * 10) *= 2;
assert_eq!(map["poneyland"], 18);
pub fn key(&self) -> &K
pub fn key(&self) -> &K
Returns a reference to this entry’s key.
§Examples
use hashbrown::HashMap;
let mut map: HashMap<&str, u32> = HashMap::new();
map.entry("poneyland").or_insert(3);
// existing key
assert_eq!(map.entry("poneyland").key(), &"poneyland");
// nonexistent key
assert_eq!(map.entry("horseland").key(), &"horseland");
pub fn and_modify<F>(self, f: F) -> Entry<'a, K, V, S, A>
pub fn and_modify<F>(self, f: F) -> Entry<'a, K, V, S, A>
Provides in-place mutable access to an occupied entry before any potential inserts into the map.
§Examples
use hashbrown::HashMap;
let mut map: HashMap<&str, u32> = HashMap::new();
map.entry("poneyland")
.and_modify(|e| { *e += 1 })
.or_insert(42);
assert_eq!(map["poneyland"], 42);
map.entry("poneyland")
.and_modify(|e| { *e += 1 })
.or_insert(42);
assert_eq!(map["poneyland"], 43);
pub fn and_replace_entry_with<F>(self, f: F) -> Entry<'a, K, V, S, A>
pub fn and_replace_entry_with<F>(self, f: F) -> Entry<'a, K, V, S, A>
Provides shared access to the key and owned access to the value of an occupied entry and allows to replace or remove it based on the value of the returned option.
§Examples
use hashbrown::HashMap;
use hashbrown::hash_map::Entry;
let mut map: HashMap<&str, u32> = HashMap::new();
let entry = map
.entry("poneyland")
.and_replace_entry_with(|_k, _v| panic!());
match entry {
Entry::Vacant(e) => {
assert_eq!(e.key(), &"poneyland");
}
Entry::Occupied(_) => panic!(),
}
map.insert("poneyland", 42);
let entry = map
.entry("poneyland")
.and_replace_entry_with(|k, v| {
assert_eq!(k, &"poneyland");
assert_eq!(v, 42);
Some(v + 1)
});
match entry {
Entry::Occupied(e) => {
assert_eq!(e.key(), &"poneyland");
assert_eq!(e.get(), &43);
}
Entry::Vacant(_) => panic!(),
}
assert_eq!(map["poneyland"], 43);
let entry = map
.entry("poneyland")
.and_replace_entry_with(|_k, _v| None);
match entry {
Entry::Vacant(e) => assert_eq!(e.key(), &"poneyland"),
Entry::Occupied(_) => panic!(),
}
assert!(!map.contains_key("poneyland"));
§impl<'a, K, V, S, A> Entry<'a, K, V, S, A>where
V: Default,
A: Allocator,
impl<'a, K, V, S, A> Entry<'a, K, V, S, A>where
V: Default,
A: Allocator,
pub fn or_default(self) -> &'a mut Vwhere
K: Hash,
S: BuildHasher,
pub fn or_default(self) -> &'a mut Vwhere
K: Hash,
S: BuildHasher,
Ensures a value is in the entry by inserting the default value if empty, and returns a mutable reference to the value in the entry.
§Examples
use hashbrown::HashMap;
let mut map: HashMap<&str, Option<u32>> = HashMap::new();
// nonexistent key
map.entry("poneyland").or_default();
assert_eq!(map["poneyland"], None);
map.insert("horseland", Some(3));
// existing key
assert_eq!(map.entry("horseland").or_default(), &mut Some(3));
Examples found in repository?
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
fn assign_clips(
mut players: Query<&mut AnimationPlayer>,
targets: Query<(Entity, &AnimationTarget)>,
parents: Query<&Parent>,
scene_handle: Res<SceneHandle>,
clips: Res<Assets<AnimationClip>>,
gltf_assets: Res<Assets<Gltf>>,
assets: Res<AssetServer>,
mut graphs: ResMut<Assets<AnimationGraph>>,
mut commands: Commands,
mut setup: Local<bool>,
) {
if scene_handle.is_loaded && !*setup {
*setup = true;
} else {
return;
}
let gltf = gltf_assets.get(&scene_handle.gltf_handle).unwrap();
let animations = &gltf.animations;
if animations.is_empty() {
return;
}
let count = animations.len();
let plural = if count == 1 { "" } else { "s" };
info!("Found {} animation{plural}", animations.len());
let names: Vec<_> = gltf.named_animations.keys().collect();
info!("Animation names: {names:?}");
// Map animation target IDs to entities.
let animation_target_id_to_entity: HashMap<_, _> = targets
.iter()
.map(|(entity, target)| (target.id, entity))
.collect();
// Build up a list of all animation clips that belong to each player. A clip
// is considered to belong to an animation player if all targets of the clip
// refer to entities whose nearest ancestor player is that animation player.
let mut player_to_graph: EntityHashMap<(AnimationGraph, Vec<AnimationNodeIndex>)> =
EntityHashMap::default();
for (clip_id, clip) in clips.iter() {
let mut ancestor_player = None;
for target_id in clip.curves().keys() {
// If the animation clip refers to entities that aren't present in
// the scene, bail.
let Some(&target) = animation_target_id_to_entity.get(target_id) else {
continue;
};
// Find the nearest ancestor animation player.
let mut current = Some(target);
while let Some(entity) = current {
if players.contains(entity) {
match ancestor_player {
None => {
// If we haven't found a player yet, record the one
// we found.
ancestor_player = Some(entity);
}
Some(ancestor) => {
// If we have found a player, then make sure it's
// the same player we located before.
if ancestor != entity {
// It's a different player. Bail.
ancestor_player = None;
break;
}
}
}
}
// Go to the next parent.
current = parents.get(entity).ok().map(|parent| parent.get());
}
}
let Some(ancestor_player) = ancestor_player else {
warn!(
"Unexpected animation hierarchy for animation clip {:?}; ignoring.",
clip_id
);
continue;
};
let Some(clip_handle) = assets.get_id_handle(clip_id) else {
warn!("Clip {:?} wasn't loaded.", clip_id);
continue;
};
let &mut (ref mut graph, ref mut clip_indices) =
player_to_graph.entry(ancestor_player).or_default();
let node_index = graph.add_clip(clip_handle, 1.0, graph.root);
clip_indices.push(node_index);
}
// Now that we've built up a list of all clips that belong to each player,
// package them up into a `Clips` component, play the first such animation,
// and add that component to the player.
for (player_entity, (graph, clips)) in player_to_graph {
let Ok(mut player) = players.get_mut(player_entity) else {
warn!("Animation targets referenced a nonexistent player. This shouldn't happen.");
continue;
};
let graph = graphs.add(graph);
let animations = Clips::new(clips);
player.play(animations.current()).repeat();
commands
.entity(player_entity)
.insert(animations)
.insert(graph);
}
}
Trait Implementations§
Auto Trait Implementations§
impl<'a, K, V, S, A> Freeze for Entry<'a, K, V, S, A>where
K: Freeze,
impl<'a, K, V, S, A> RefUnwindSafe for Entry<'a, K, V, S, A>
impl<'a, K, V, S, A> Send for Entry<'a, K, V, S, A>
impl<'a, K, V, S, A> Sync for Entry<'a, K, V, S, A>
impl<'a, K, V, S, A> Unpin for Entry<'a, K, V, S, A>where
K: Unpin,
impl<'a, K, V, S, A = Global> !UnwindSafe for Entry<'a, K, V, S, A>
Blanket Implementations§
§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T
ShaderType
for self
. When used in AsBindGroup
derives, it is safe to assume that all images in self
exist.source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more