From c39725212c332bdc0914ca17947c8251b3b1e006 Mon Sep 17 00:00:00 2001 From: kjeremy Date: Mon, 30 Mar 2020 16:15:28 -0400 Subject: Use more functional programming in ArenaMap::insert I find this more readable and it flattens out the body a little. --- crates/ra_arena/src/map.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'crates/ra_arena/src') diff --git a/crates/ra_arena/src/map.rs b/crates/ra_arena/src/map.rs index 5e764113d..b9521c342 100644 --- a/crates/ra_arena/src/map.rs +++ b/crates/ra_arena/src/map.rs @@ -17,11 +17,9 @@ impl ArenaMap, V> { if self.v.capacity() <= idx { self.v.reserve(idx + 1 - self.v.capacity()); } - if self.v.len() <= idx { - while self.v.len() <= idx { - self.v.push(None); - } - } + + let fill = (idx + 1).saturating_sub(self.v.len()); + self.v.extend(std::iter::repeat_with(|| None).take(fill)); self.v[idx] = Some(t); } -- cgit v1.2.3 From f633f69e36f0aee2cb77a3436b54aeca9aa0d10e Mon Sep 17 00:00:00 2001 From: kjeremy Date: Mon, 30 Mar 2020 17:09:21 -0400 Subject: Do not call reserve since extend will handle it. `Take` implements `TrustedLen` so we are guaranteed that only one reserve call will be made. --- crates/ra_arena/src/map.rs | 3 --- 1 file changed, 3 deletions(-) (limited to 'crates/ra_arena/src') diff --git a/crates/ra_arena/src/map.rs b/crates/ra_arena/src/map.rs index b9521c342..e4ddbad42 100644 --- a/crates/ra_arena/src/map.rs +++ b/crates/ra_arena/src/map.rs @@ -14,9 +14,6 @@ pub struct ArenaMap { impl ArenaMap, V> { pub fn insert(&mut self, id: Idx, t: V) { let idx = Self::to_idx(id); - if self.v.capacity() <= idx { - self.v.reserve(idx + 1 - self.v.capacity()); - } let fill = (idx + 1).saturating_sub(self.v.len()); self.v.extend(std::iter::repeat_with(|| None).take(fill)); -- cgit v1.2.3 From 7ca5ef67e89241065d328445ed7d361270f4b9de Mon Sep 17 00:00:00 2001 From: kjeremy Date: Tue, 31 Mar 2020 09:02:12 -0400 Subject: Use resize_with --- crates/ra_arena/src/map.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'crates/ra_arena/src') diff --git a/crates/ra_arena/src/map.rs b/crates/ra_arena/src/map.rs index e4ddbad42..0f33907c0 100644 --- a/crates/ra_arena/src/map.rs +++ b/crates/ra_arena/src/map.rs @@ -15,8 +15,7 @@ impl ArenaMap, V> { pub fn insert(&mut self, id: Idx, t: V) { let idx = Self::to_idx(id); - let fill = (idx + 1).saturating_sub(self.v.len()); - self.v.extend(std::iter::repeat_with(|| None).take(fill)); + self.v.resize_with((idx + 1).max(self.v.len()), || None); self.v[idx] = Some(t); } -- cgit v1.2.3