use batch_impl::batch_impl;
use std::rc::Rc;
#[batch_impl(i32 impl{T} { fn bits(&self) -> u32 { T::BITS } })]
trait ImplT {
fn bits(&self) -> u32;
}
#[test]
fn impl_single_slot() {
assert_eq!(0i32.bits(), 32);
}
#[batch_impl(Rc<i32> impl{Rc<T>} { fn bits(&self) -> u32 { T::BITS } })]
trait ImplRcT {
fn bits(&self) -> u32;
}
#[test]
fn impl_equal_base_literal() {
let r = Rc::new(0i32);
assert_eq!(r.bits(), 32);
}
#[batch_impl(Box<i32> impl{Rc<T>} { fn mk(x: i32) -> Rc<T> { Rc::new(x) } })]
trait ImplRcSlot {
fn mk(x: i32) -> Self;
}
#[test]
fn impl_different_base_slot() {
let b: Box<i32> = <Box<i32> as ImplRcSlot>::mk(7);
assert_eq!(*b, 7);
}
#[batch_impl([Box, Rc]^u32 impl{W<T>} { fn mk(x: u32) -> W<T> { W::new(x) } })]
trait ImplMatrix {
fn mk(x: u32) -> Self;
}
#[test]
fn impl_matrix_distribution() {
assert_eq!(*<Box<u32> as ImplMatrix>::mk(5), 5);
assert_eq!(*<Rc<u32> as ImplMatrix>::mk(6), 6);
}
#[batch_impl(i32 { fn b8(&self) -> u32 { 8 } } impl{X})]
trait ImplOrderAny {
fn b8(&self) -> u32;
}
#[test]
fn impl_attachment_any_order() {
assert_eq!(0i32.b8(), 8);
}