diff options
author | Shotaro Yamada <[email protected]> | 2019-10-14 04:56:18 +0100 |
---|---|---|
committer | Shotaro Yamada <[email protected]> | 2019-10-14 06:25:05 +0100 |
commit | f8d4cdc170bead42db3ffa647318ecf2bd6430e7 (patch) | |
tree | 2c020016af1fd5239fdad65b816b4cccea97df41 /crates/ra_hir/src/util.rs | |
parent | 77f2dd96a122e59a8d8df8afb53a741df9b1af76 (diff) |
Avoid cloning `Arc<[T]>` into a vec if possible
Diffstat (limited to 'crates/ra_hir/src/util.rs')
-rw-r--r-- | crates/ra_hir/src/util.rs | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/crates/ra_hir/src/util.rs b/crates/ra_hir/src/util.rs new file mode 100644 index 000000000..46f423c91 --- /dev/null +++ b/crates/ra_hir/src/util.rs | |||
@@ -0,0 +1,19 @@ | |||
1 | //! Internal utility functions. | ||
2 | |||
3 | use std::sync::Arc; | ||
4 | |||
5 | /// Helper for mutating `Arc<[T]>` (i.e. `Arc::make_mut` for Arc slices). | ||
6 | /// The underlying values are cloned if there are other strong references. | ||
7 | pub(crate) fn make_mut_arc_slice<T: Clone, R>( | ||
8 | a: &mut Arc<[T]>, | ||
9 | f: impl FnOnce(&mut [T]) -> R, | ||
10 | ) -> R { | ||
11 | if let Some(s) = Arc::get_mut(a) { | ||
12 | f(s) | ||
13 | } else { | ||
14 | let mut v = a.to_vec(); | ||
15 | let r = f(&mut v); | ||
16 | *a = Arc::from(v); | ||
17 | r | ||
18 | } | ||
19 | } | ||