From f8d4cdc170bead42db3ffa647318ecf2bd6430e7 Mon Sep 17 00:00:00 2001 From: Shotaro Yamada Date: Mon, 14 Oct 2019 12:56:18 +0900 Subject: Avoid cloning `Arc<[T]>` into a vec if possible --- crates/ra_hir/src/util.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 crates/ra_hir/src/util.rs (limited to 'crates/ra_hir/src/util.rs') 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 @@ +//! Internal utility functions. + +use std::sync::Arc; + +/// Helper for mutating `Arc<[T]>` (i.e. `Arc::make_mut` for Arc slices). +/// The underlying values are cloned if there are other strong references. +pub(crate) fn make_mut_arc_slice( + a: &mut Arc<[T]>, + f: impl FnOnce(&mut [T]) -> R, +) -> R { + if let Some(s) = Arc::get_mut(a) { + f(s) + } else { + let mut v = a.to_vec(); + let r = f(&mut v); + *a = Arc::from(v); + r + } +} -- cgit v1.2.3