use batch_impl::batch_impl;
use std::rc::Rc;
#[batch_impl(Vec<Vec<u8>> impl{A<B<C>>} { fn n(&self) -> usize { self.len() } })]
trait NestT1 {
fn n(&self) -> usize;
}
#[test]
fn impl_nested_template() {
let v = vec![vec![1u8], vec![2u8]];
assert_eq!(v.n(), 2);
}
#[batch_impl(&u32 impl{&A} { fn val(&self) -> A { **self } })]
trait NestT2 {
fn val(&self) -> u32;
}
#[test]
fn impl_reference_template() {
let x = 42u32;
assert_eq!((&x).val(), 42);
}
#[batch_impl(&mut u16 impl{&mut A} { fn val(&self) -> A { **self } })]
trait NestT3 {
fn val(&self) -> u16;
}
#[test]
fn impl_refmut_template() {
let mut x = 7u16;
let r = &mut x;
assert_eq!(r.val(), 7);
}
#[batch_impl(*const u8 impl{*const A} { fn deref_unsafe(&self) -> A { unsafe { **self } } })]
trait NestT4 {
fn deref_unsafe(&self) -> u8;
}
#[test]
fn impl_ptr_template() {
let x = 9u8;
let p = &x as *const u8;
assert_eq!(p.deref_unsafe(), 9);
}
#[batch_impl((u8, u16) impl{(A, B)} { fn sum(&self) -> u32 { self.0 as u32 + self.1 as u32 } })]
trait NestT5 {
fn sum(&self) -> u32;
}
#[test]
fn impl_tuple_template() {
let t = (1u8, 2u16);
assert_eq!(t.sum(), 3);
}
#[batch_impl([u8; 2] impl{[A; 2]} { fn n(&self) -> usize { A::BITS as usize * self.len() } })]
trait NestT6 {
fn n(&self) -> usize;
}
#[test]
fn impl_array_template() {
let a = [1u8, 2];
assert_eq!(a.n(), 16); }
#[batch_impl([u8] impl{[A]} { fn n(&self) -> usize { self.len() } })]
trait NestT7 {
fn n(&self) -> usize;
}
#[test]
fn impl_slice_template() {
let s: &[u8] = &[1, 2, 3];
assert_eq!(s.n(), 3);
}
#[batch_impl(Rc<i32> impl{Rc<A>} { fn val(&self) -> A { **self } })]
trait NestT8 {
fn val(&self) -> i32;
}
#[test]
fn impl_container_equal_base() {
let r = Rc::new(5i32);
assert_eq!(r.val(), 5);
}