Macro define_shared_ointer

Source
macro_rules! define_shared_ointer {
    ($ointer_strong:ident, $pointer_strong:ident, $ointer_weak:ident, $pointer_weak:ident, $bits:literal) => { ... };
}
Expand description

Macro used to define Rc/Weak or Arc/Weak like shared ointers. This crate defines BRc/BWeak(called byte stolen Rc/Weak) that wraps Rc/Weak and steal high 8-bits(1-byte), by using define_shared_ointer!(BRc, Rc, BWeak, Weak, 8); And define ORc/OWeak(called orientable Rc/Weak) by using define_shared_ointer!(ORc, Rc, OWeak, Weak, 1);

Tests over BArc

use ointer::{sync::BArc, Ointer};
use core::mem::size_of;
let mut o = BArc::new(1);
assert_eq!(*o, 1);
assert_eq!(o.get::<bool>(), false);

// Define a small enum for testing.
#[derive(Clone, Copy, PartialEq, Debug)]
enum MySmallEnum {
    _A,
    B,
    _C,
}
assert_eq!(size_of::<MySmallEnum>(), 1);

o.set_mut(MySmallEnum::B);
assert_eq!(*o, 1);
assert_eq!(o.get::<MySmallEnum>(), MySmallEnum::B);

// Modify the bool and pointer inside the ointer.
o.map_mut(|b: &mut bool, p| {
    *b = !*b;
    *p = Default::default();
});
assert_eq!(*o.downgrade().upgrade().unwrap(), Default::default());