use batch_impl::batch_impl;
struct Triple<T, U, V>(T, U, V);
#[batch_impl(Triple<*().3> where{@0..: Clone} { fn m(&self) {} })]
#[allow(dead_code)]
trait RangeWhereAll {
fn m(&self);
}
#[test]
fn range_where_all_fresh() {
fn check<T: RangeWhereAll>(_: &T) {}
check(&Triple(0u8, 1u16, 2u32));
}
#[batch_impl(Triple<*().3> where{@1..: Copy} { fn m(&self) {} })]
#[allow(dead_code)]
trait RangeWhereTail {
fn m(&self);
}
#[test]
fn range_where_tail() {
fn check<T: RangeWhereTail>(_: &T) {}
check(&Triple(0u8, 1u16, 2u32));
}
#[batch_impl(Triple<*().3> where{@0..=1: Copy} { fn m(&self) {} })]
#[allow(dead_code)]
trait RangeWhereClosed {
fn m(&self);
}
#[test]
fn range_where_closed() {
fn check<T: RangeWhereClosed>(_: &T) {}
check(&Triple(0u8, 1u16, 2u32));
}
#[allow(dead_code)]
trait HasOut {
type Out;
}
struct Wrap2<A, B>(A, B);
#[batch_impl(Wrap2<*().2> where{@0..: HasOut, @0..::Out: Clone} { fn m(&self) {} })]
#[allow(dead_code)]
trait RangeAssocPath {
fn m(&self);
}
#[batch_impl(Wrap2<*().2> where{@0..: Clone, @0..=1: Copy} { fn m(&self) {} })]
#[allow(dead_code)]
trait RangeWhereCombined {
fn m(&self);
}
#[test]
fn range_where_combined() {
fn check<T: RangeWhereCombined>(_: &T) {}
check(&Wrap2(0u8, 1u16));
}
#[batch_impl(Wrap2<*().2> where{@all_fresh: Clone} { fn m(&self) {} })]
#[allow(dead_code)]
trait RangeAllFreshEq {
fn m(&self);
}
#[test]
fn range_all_fresh_equivalence() {
fn check<T: RangeAllFreshEq>(_: &T) {}
check(&Wrap2(0u8, 1u16));
}
struct DeclTarget;
#[batch_impl(<@0..> GenConvDecl<*().2> DeclTarget where @0..: Clone { fn m(&self) {} })]
#[allow(dead_code)]
trait GenConvDecl<T, U> {
fn m(&self);
}
#[test]
fn range_decl_position() {
fn check<T: GenConvDecl<u8, u16>>(_: &T) {}
check(&DeclTarget);
}
struct MultiTarget;
#[batch_impl(
<@0..> <@1..> PairGen<*().2, *().3> MultiTarget where{@1_0..: Clone}
{ fn m(&self) {} }
)]
#[allow(dead_code)]
trait PairGen<A, B, C, D, E> {
fn m(&self);
}
#[test]
fn grouped_range_where() {
fn check<T: PairGen<u8, u16, u32, u64, u128>>(_: &T) {}
check(&MultiTarget);
}
#[batch_impl(
<@0..> <@1_1..> PairGenDecl<*().2, *().3> MultiTarget
{ fn m(&self) {} }
)]
#[allow(dead_code)]
trait PairGenDecl<A, B, C, D, E> {
fn m(&self);
}
#[test]
fn grouped_range_decl() {
fn check<T: PairGenDecl<u8, u16, u32, u64, u128>>(_: &T) {}
check(&MultiTarget);
}