Expand description
ยง๐ฆ AnyRef โ Runtime-Typed Reference-Counted Smart Pointer for Rust
AnyRef is a custom smart pointer similar to Arc, designed for storing dynamically typed (dyn Any) values with strong and weak reference support, runtime downcasting, and optional thread-safe interior mutability.
It is ideal for scenarios where type erasure and runtime polymorphism are needed without exposing generic interfaces.
ยงโจ Features
- โ
Runtime type storage via
dyn Any - ๐ Strong and weak reference counting
- ๐ Optional thread-safe mutability (with internal locking)
- ๐ Safe runtime downcasting (
try_downcast,try_downcast_mut) - ๐ซ No generics in the pointer interface
- ๐ง Suitable for runtime-managed object graphs
ยงโ๏ธ Example Usage
ยงBasic Allocation and Access
use castbox::AnyRef;
let a = AnyRef::new(42i32);
assert_eq!(a.as_ref::<i32>(), 42);ยงRuntime Downcasting
use castbox::AnyRef;
let a = AnyRef::new("hello".to_string());
if let Some(s) = a.try_downcast_ref::<String>() {
assert_eq!(s, "hello");
}ยงCloning and Reference Counting
use castbox::AnyRef;
let a = AnyRef::new(vec![1, 2, 3]);
let b = a.clone();
assert_eq!(AnyRef::strong_count(&a), 2);ยงWeak Reference
use castbox::AnyRef;
let a = AnyRef::new("temporary".to_string());
let w = a.downgrade();
assert!(w.upgrade().is_some());
drop(a);
assert!(w.upgrade().is_none());ยงThread-Safe Mode
use castbox::AnyRef;
use crossync::sync::Barrier;
use std::thread;
let x = AnyRef::new(123i32);
let mut handles = vec![];
let barrier = AnyRef::new(Barrier::with_capacity(10, 0));
for i in 0..10 {
let x_clone = x.clone();
let barrier_clone = barrier.clone();
handles.push(thread::spawn(move || {
barrier_clone.try_downcast_ref::<Barrier>().unwrap().wait();
let val = x_clone.as_ref::<i32>();
assert_eq!(*val, 123);
}));
}
for h in handles {
h.join().unwrap();
}
assert_eq!(AnyRef::strong_count(&x), 1);
assert_eq!(AnyRef::weak_count(&x), 0);ยง๐ฆ Installation
Install AnyRef from crates.io Open your Cargo.toml and add:
[dependencies]
castbox = "0.1.1" # or the latest version available ยง๐ License
Apache-2.0
Modulesยง
Structsยง
- AnyRef
- Arw
- Watch
Guard Mut - used as wrapper for a pointer to a reference
- Watch
Guard Ref - used as wrapper for a pointer to a reference
- Weak
AnyRef - WeakArw