| Crates.io | castbox |
| lib.rs | castbox |
| version | 0.1.4 |
| created_at | 2025-08-05 17:20:35.301414+00 |
| updated_at | 2026-01-19 13:53:33.630356+00 |
| description | A Runtime-Typed Reference-Counted Smart Pointer and Concurrent Programming tools. |
| homepage | https://github.com/sh1zen/castbox |
| repository | https://github.com/sh1zen/castbox |
| max_upload_size | |
| id | 1782278 |
| size | 100,760 |
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.
dyn Anytry_downcast, try_downcast_mut)use castbox::AnyRef;
let a = AnyRef::new(42i32);
assert_eq!(a.as_ref::<i32>(), 42);
use castbox::AnyRef;
let a = AnyRef::new("hello".to_string());
if let Some(s) = a.try_downcast_ref::<String>() {
assert_eq!(s, "hello");
}
use castbox::AnyRef;
let a = AnyRef::new(vec![1, 2, 3]);
let b = a.clone();
assert_eq!(AnyRef::strong_count(&a), 2);
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());
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);
Install AnyRef from crates.io Open your Cargo.toml and add:
[dependencies]
castbox = "0.1.4" # or the latest version available
Apache-2.0