shredder 0.2.0

Garbage collection as a library for Rust
Documentation
use std::any::Any;

use shredder::marker::{GcDeref, GcDrop};
use shredder::{DerefGc, Gc, Scan, ToScan};

trait Super: Scan + ToScan + GcDrop + GcDeref + Any {}

#[derive(Scan)]
#[shredder(can_deref)]
struct Sub;

impl Super for Sub {}

#[derive(Scan)]
#[shredder(can_deref)]
struct NotSub;

#[test]
fn can_downcast_sub_test() {
    let sub = Box::new(Sub);
    let sub = sub as Box<dyn Super>;

    let gc = Gc::from_box(sub);
    let v = gc.downcast::<Sub>();
    assert!(v.is_some());
}

#[test]
fn cant_downcast_not_sub_test() {
    let sub = Box::new(Sub);
    let sub = sub as Box<dyn Super>;

    let gc = Gc::from_box(sub);
    let v = gc.downcast::<NotSub>();
    assert!(v.is_none());
}

#[test]
fn can_downcast_deref_gc_sub_test() {
    let sub = Box::new(Sub);
    let sub = sub as Box<dyn Super>;

    let gc = DerefGc::from_box(sub);
    let v = gc.downcast::<Sub>();
    assert!(v.is_some());
}

#[test]
fn cant_downcast_deref_gc_not_sub_test() {
    let sub = Box::new(Sub);
    let sub = sub as Box<dyn Super>;

    let gc = DerefGc::from_box(sub);
    let v = gc.downcast::<NotSub>();
    assert!(v.is_none());
}