From 81769f803700a65ba32981c7ac642954b7b36084 Mon Sep 17 00:00:00 2001 From: anonfedora Date: Fri, 23 May 2025 07:51:12 +0100 Subject: [PATCH] feat: Session six Interior Mutability --- src/session_six/interior_mutability.rs | 91 ++++++++++++++++++++++++++ src/session_six/mod.rs | 1 + 2 files changed, 92 insertions(+) create mode 100644 src/session_six/interior_mutability.rs create mode 100644 src/session_six/mod.rs diff --git a/src/session_six/interior_mutability.rs b/src/session_six/interior_mutability.rs new file mode 100644 index 0000000..c1d5be5 --- /dev/null +++ b/src/session_six/interior_mutability.rs @@ -0,0 +1,91 @@ +use std::cell::{Cell, RefCell, UnsafeCell}; + +struct Counter { + value: Cell, +} + +impl Counter { + fn new() -> Self { + Counter { + value: Cell::new(0), + } + } + + fn increment(&self) { + self.value.set(self.value.get() + 1); + } + + fn get(&self) -> u32 { + self.value.get() + } + + fn increment_by_number(&self, number: u32) { + self.value.set(self.value.get() + number) + } +} + +struct Database { + data: RefCell>, +} + +impl Database { + fn new() -> Self { + Database { + data: RefCell::new(Vec::new()), + } + } + + fn insert(&self, item: String) { + self.data.borrow_mut().push(item); + } + + fn items(&self) -> Vec { + self.data.borrow().clone() + } +} + +pub struct MyCell { + value: UnsafeCell, +} + +impl MyCell { + pub fn new(value: T) -> Self { + MyCell { + value: UnsafeCell::new(value), + } + } + + pub fn get(&self) -> &T { + // Safety: We're only returning an immutable reference + unsafe { &*self.value.get() } + } + + pub fn set(&self, new_value: T) { + // Safety: We're replacing the value entirely + unsafe { + *self.value.get() = new_value; + } + } +} + +pub fn main() { + let number = Counter::new(); + number.get(); + println!("{}", number.get()); + number.increment(); + println!("{}", number.get()); + number.increment_by_number(4); + println!("{}", number.get()); + + let db = Database::new(); + db.insert("Data 1".to_string()); + db.insert("Data 2".to_string()); + + let items = db.items(); + println!("Items: {:?}", items); // Output: Items: ["Data 1", "Data 2"] + + // MyCell + let number = MyCell::new(20); + number.get(); + println!("{}", number.get()); +} diff --git a/src/session_six/mod.rs b/src/session_six/mod.rs new file mode 100644 index 0000000..1a36a84 --- /dev/null +++ b/src/session_six/mod.rs @@ -0,0 +1 @@ +pub mod interior_mutability;