mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-09 19:58:50 +00:00
20 lines
485 B
Rust
20 lines
485 B
Rust
|
//! 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<T: Clone, R>(
|
||
|
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
|
||
|
}
|
||
|
}
|