use batch_impl::batch_impl;
use std::borrow::Cow;
use std::rc::Rc;
#[batch_impl(#blanket(@all_methods){Cow<'_> where{@0: ToOwned + ?Sized, @0::Owned: @trait}})]
trait CowWhereTrait {
fn klen(&self) -> usize;
}
impl CowWhereTrait for str {
fn klen(&self) -> usize {
self.len()
}
}
impl CowWhereTrait for String {
fn klen(&self) -> usize {
self.len()
}
}
#[batch_impl(#blanket(@all_methods){@Cow})]
trait CowConstTrait {
fn clen(&self) -> usize;
}
impl CowConstTrait for str {
fn clen(&self) -> usize {
self.len()
}
}
impl CowConstTrait for String {
fn clen(&self) -> usize {
self.len()
}
}
#[batch_impl(u8 #fill([m1, m2]){1} #fill(@all, -[m1, m2]){3})]
trait BracketArgs {
fn m1(&self) -> u32;
fn m2(&self) -> u32;
fn m3(&self) -> u32;
}
#[batch_impl(<T> WhereStyle<T> Vec<T> where{T: Clone} { fn wdup(&self) -> usize { self.len() } })]
trait WhereStyle<T: Clone> {
fn wdup(&self) -> usize;
}
#[test]
fn macro_meta_complete() {
let c: Cow<'static, str> = Cow::Borrowed("abc");
assert_eq!(c.klen(), 3); assert_eq!(c.clen(), 3); let s: Cow<'static, str> = Cow::Owned("xy".to_string());
assert_eq!(s.klen(), 2);
assert_eq!(s.clen(), 2);
assert_eq!(0u8.m1(), 1); assert_eq!(0u8.m2(), 1);
assert_eq!(0u8.m3(), 3); let v = vec![1u32];
assert_eq!(v.wdup(), 1); }
#[batch_impl(u32 #fill(@all_required){4})]
trait ReqMix2 {
fn rfn(&self) -> u32;
fn dfn(&self) -> u32 {
1
}
const RC: u32;
const DC: u32 = 2;
}
#[batch_impl(u64 #fill(@all_default_constants){8})]
trait DefConstOnly {
fn m(&self) -> u32 {
3
}
const C: u32 = 7;
}
#[batch_impl(u16 #fill(@all_required_types){u16})]
trait ReqTypesOnly {
type RT;
}
#[batch_impl(u8 #fill(@all_methods, -@all_default_methods){1})]
trait MarkerMinus2 {
fn r1(&self) -> u32;
fn r2(&self) -> u32;
fn d1(&self) -> u32 {
9
}
}
#[batch_impl(<T> @trait<T> Vec<T> { fn tl(&self) -> usize { self.len() } })]
trait AtTraitSpec<T> {
fn tl(&self) -> usize;
}
#[batch_impl(
Vec<u32> {
fn dl1(&self) -> usize { self.len() }
fn dl2(&self) -> usize { self.len() }
},
Box^Vec^u32 #delegate([dl1, dl2]){**self}
)]
trait DelBr {
fn dl1(&self) -> usize;
fn dl2(&self) -> usize;
}
#[batch_impl(u32 { fn own(&self) -> u32 { *self } })]
#[batch_impl(#blanket(own){Box where{@0: Copy}})]
trait OwnAt0 {
fn own(&self) -> u32;
}
#[batch_impl(()^3 where{@2: Clone} { fn tk3() -> u32 { 3 } })]
trait TupleWhereAt3 {
fn tk3() -> u32;
}
#[test]
fn macro_meta_review_extras() {
assert_eq!(0u32.rfn(), 4);
assert_eq!(0u32.dfn(), 1); assert_eq!(<u32 as ReqMix2>::RC, 4);
assert_eq!(<u32 as ReqMix2>::DC, 2);
assert_eq!(<u64 as DefConstOnly>::C, 8); assert_eq!(0u64.m(), 3);
fn _check_t<T: ReqTypesOnly>() {}
_check_t::<u16>();
let _: <u16 as ReqTypesOnly>::RT = 5u16;
assert_eq!(0u8.r1(), 1);
assert_eq!(0u8.r2(), 1);
assert_eq!(0u8.d1(), 9);
let v = vec![1u32, 2];
assert_eq!(v.tl(), 2);
let b: Box<Vec<u32>> = Box::new(vec![1, 2, 3]);
assert_eq!(b.dl1(), 3);
assert_eq!(b.dl2(), 3);
assert_eq!(Box::new(5u32).own(), 5);
assert_eq!(<(u8, u16, u32) as TupleWhereAt3>::tk3(), 3);
}
#[batch_impl(<T> WhereAtTrait<T> Vec<T> where{T: @trait<T>} { fn wn(&self) -> usize { self.len() } })]
trait WhereAtTrait<T: Clone> {
fn wn(&self) -> usize;
}
impl WhereAtTrait<u32> for u32 {
fn wn(&self) -> usize {
1
}
}
macro_rules! make_impls {
($($spec:tt)*) => {
#[batch_impl($($spec)*)]
trait MacroGenTrait {
fn gm(&self) -> u32;
}
};
}
make_impls!([Box, Rc]^@u* { fn gm(&self) -> u32 { 9 } });
#[test]
fn review_fixes_locked() {
let v = vec![1u32];
assert_eq!(v.wn(), 1); let b = Box::new(1u32);
let r = Rc::new(1u32);
assert_eq!(b.gm(), 9); assert_eq!(r.gm(), 9);
}