#![allow(unused_variables)] fn main() { use std::borrow::Cow; struct Items<'a, X> where [X]: ToOwned>, { values: Cow<'a, [X]>, } impl<'a, X: Clone + 'a> Items<'a, X> where [X]: ToOwned>, { fn new(v: Cow<'a, [X]>) -> Self { Items { values: v } } } let readonly = [1, 2]; let borrowed = Items::new((&readonly[..]).into()); match borrowed { Items { values: Cow::Borrowed(b) } => println!("borrowed {b:?}"), _ => panic!("expect borrowed value"), } let mut clone_on_write = borrowed; clone_on_write.values.to_mut().push(3); println!("clone_on_write = {:?}", clone_on_write.values); match clone_on_write { Items { values: Cow::Owned(_) } => println!("clone_on_write contains owned data"), _ => panic!("expect owned data"), } }