use batch_impl::batch_impl;
fn main() {
println!("=== ds-test: mimo 代码审查 ===\n");
test_boundary_cases();
test_caret_nesting();
test_cartesian();
test_append_tuple();
test_dash();
test_operator_precedence();
test_self_identity();
test_pointer_chain();
test_unsafe_double();
test_fn_caret_vs_dash();
test_attr_caret_chain();
test_unit_target();
test_range_zero();
test_deep_caret();
test_hashmap_prefill();
test_cartesian_3elem();
test_26_generics();
test_mixed_ref_ptr();
test_fn_edge_cases();
test_caret_with_angle();
test_multi_modifier();
test_long_dash_chain();
test_caret_dash_interaction();
println!("\nAll ds-tests passed!");
}
fn test_boundary_cases() {
#[batch_impl(Box^[Box^isize])]
trait S1a {}
fn _1a<T: S1a>() {}
_1a::<Box<[Box<isize>]>>();
println!(" 1a. Box^[Box^isize] = Box<[Box<isize>]>: OK");
#[batch_impl([Box, Vec]^[&^u32, u64])]
trait S1b {}
fn _1b<T: S1b>() {}
_1b::<Box<&u32>>();
_1b::<Box<u64>>();
_1b::<Vec<&u32>>();
_1b::<Vec<u64>>();
println!(" 1b. [Box,Vec]^[&^u32, u64] = 4 impls: OK");
}
fn test_caret_nesting() {
#[batch_impl(Box^Box^Box^u32)]
trait S2a {}
fn _2a<T: S2a>() {}
_2a::<Box<Box<Box<u32>>>>();
println!(" 2a. Box^Box^Box^u32: OK");
#[batch_impl([Box, Vec]^[u32, i64])]
trait S2b {}
fn _2b<T: S2b>() {}
_2b::<Box<u32>>();
_2b::<Box<i64>>();
_2b::<Vec<u32>>();
_2b::<Vec<i64>>();
println!(" 2b. [Box,Vec]^[u32,i64] = 4 impls: OK");
#[batch_impl([&, self]^[u32, i64])]
trait S2c {}
fn _2c<T: S2c>() {}
_2c::<&u32>();
_2c::<&i64>();
_2c::<u32>();
_2c::<i64>();
println!(" 2c. [&,self]^[u32,i64] = 4 impls: OK");
#[batch_impl(HashMap^<u32, String>)]
trait S2d {}
fn _2d<T: S2d>() {}
_2d::<HashMap<u32, String>>();
println!(" 2d. HashMap^<u32,String>: OK");
#[batch_impl(Vec^[u32, i64])]
trait S2e {}
fn _2e<T: S2e>() {}
_2e::<Vec<u32>>();
_2e::<Vec<i64>>();
println!(" 2e. Vec^[u32,i64] = 2 impls: OK");
}
fn test_cartesian() {
#[batch_impl((u32, i32)^3)]
trait S3a {}
fn _3a<T: S3a>() {}
_3a::<(u32, u32, u32)>();
_3a::<(u32, u32, i32)>();
_3a::<(u32, i32, u32)>();
_3a::<(u32, i32, i32)>();
_3a::<(i32, u32, u32)>();
_3a::<(i32, u32, i32)>();
_3a::<(i32, i32, u32)>();
_3a::<(i32, i32, i32)>();
println!(" 3a. (u32,i32)^3 = 8 impls: OK");
#[batch_impl((u32,)^3)]
trait S3b {}
fn _3b<T: S3b>() {}
_3b::<(u32, u32, u32)>();
println!(" 3b. (u32,)^3 = (u32,u32,u32): OK");
#[batch_impl(()^3)]
trait S3c {}
fn _3c<T: S3c>() {}
_3c::<(i32, i32, i32)>();
println!(" 3c. ()^3 = (A,B,C): OK");
}
fn test_append_tuple() {
#[batch_impl(()^u32)]
trait S4a {}
fn _4a<T: S4a>() {}
_4a::<(u32,)>();
println!(" 4a. ()^u32 = (u32,): OK");
#[batch_impl((i32,)^u32)]
trait S4b {}
fn _4b<T: S4b>() {}
_4b::<(i32, u32)>();
println!(" 4b. (i32,)^u32 = (i32,u32): OK");
#[batch_impl(()^Box^u32)]
trait S4c {}
fn _4c<T: S4c>() {}
_4c::<(Box<u32>,)>();
println!(" 4c. ()^Box^u32 = (Box<u32>,): OK");
}
fn test_dash() {
#[batch_impl(()-[usize, isize]-[u32, i32])]
trait S5a {}
fn _5a<T: S5a>() {}
_5a::<(usize, u32)>();
_5a::<(usize, i32)>();
_5a::<(isize, u32)>();
_5a::<(isize, i32)>();
println!(" 5a. ()-[usize,isize]-[u32,i32] = 4 impls: OK");
#[batch_impl(()-[Box^u32, Vec^isize]-[i64, i32])]
trait S5b {}
fn _5b<T: S5b>() {}
_5b::<(Box<u32>, i64)>();
_5b::<(Box<u32>, i32)>();
_5b::<(Vec<isize>, i64)>();
_5b::<(Vec<isize>, i32)>();
println!(" 5b. ()-[Box^u32,Vec^isize]-[i64,i32] = 4 impls: OK");
}
fn test_operator_precedence() {
#[batch_impl(Box^Vec^u32)]
trait S6a {}
fn _6a<T: S6a>() {}
_6a::<Box<Vec<u32>>>();
println!(" 6a. Box^Vec^u32 = Box<Vec<u32>>: OK");
#[batch_impl(HashMap-u32-String)]
trait S6b {}
fn _6b<T: S6b>() {}
_6b::<HashMap<u32, String>>();
println!(" 6b. HashMap-u32-String = HashMap<u32,String>: OK");
println!(" 6c. ^- semantic difference verified: OK");
}
fn test_self_identity() {
#[batch_impl(self^self^u32)]
trait S7a {}
fn _7a<T: S7a>() {}
_7a::<u32>();
println!(" 7a. self^self^u32 = u32: OK");
#[batch_impl([self, &]^u32)]
trait S7b {}
fn _7b<T: S7b>() {}
_7b::<u32>();
_7b::<&u32>();
println!(" 7b. [self,&]^u32 = u32, &u32: OK");
#[batch_impl([self, &mut]^i64)]
trait S7c {}
fn _7c<T: S7c>() {}
_7c::<i64>();
_7c::<&mut i64>();
println!(" 7c. [self,&mut]^i64 = i64, &mut i64: OK");
}
fn test_pointer_chain() {
#[batch_impl(*const^Box^u32)]
trait S8a {}
fn _8a<T: S8a>() {}
_8a::<*const Box<u32>>();
println!(" 8a. *const^Box^u32 = *const Box<u32>: OK");
#[batch_impl(*mut^Vec^i64)]
trait S8b {}
fn _8b<T: S8b>() {}
_8b::<*mut Vec<i64>>();
println!(" 8b. *mut^Vec^i64 = *mut Vec<i64>: OK");
#[batch_impl([&, *const]^Box^u32)]
trait S8c {}
fn _8c<T: S8c>() {}
_8c::<&Box<u32>>();
_8c::<*const Box<u32>>();
println!(" 8c. [&, *const]^Box^u32 = &Box<*>, *const Box<*>");
}
fn test_unsafe_double() {
#[batch_impl(usize, Box<u32>)]
unsafe trait S9a {}
fn _9a<T: S9a>() {}
_9a::<usize>();
_9a::<Box<u32>>();
println!(" 9a. unsafe trait auto-detect for all impls: OK");
#[batch_impl(unsafe^usize, isize)]
unsafe trait S9b {}
fn _9b<T: S9b>() {}
_9b::<usize>();
_9b::<isize>();
println!(" 9b. unsafe^usize + non-unsafe isize: OK");
}
fn test_fn_caret_vs_dash() {
#[batch_impl(fn^(u32,i32)-usize)]
trait S10a {}
fn _10a<T: S10a>() {}
_10a::<fn(u32, i32) -> usize>();
println!(" 10a. fn^(u32,i32)-usize = fn(u32,i32)->usize: OK");
#[batch_impl(fn(u32,i32)-usize)]
trait S10b {}
fn _10b<T: S10b>() {}
_10b::<fn(u32, i32) -> usize>();
println!(" 10b. fn(u32,i32)-usize = fn(u32,i32)->usize: OK");
println!(" 10c. fn^(...)-usize and fn(...)-usize both produce fn(...)->usize: OK");
#[batch_impl(fn^(u32,i32)-[usize, isize])]
trait S10d {}
fn _10d<T: S10d>() {}
_10d::<fn(u32, i32) -> usize>();
_10d::<fn(u32, i32) -> isize>();
println!(" 10d. fn^(u32,i32)-[usize,isize] = 2 fn types: OK");
#[batch_impl(fn^(u32,i32)^i64-usize)]
trait S10e {}
fn _10e<T: S10e>() {}
_10e::<fn(u32, i32, i64) -> usize>();
println!(" 10e. fn^(u32,i32)^i64-usize = fn(u32,i32,i64)->usize: OK");
#[batch_impl(fn^(u32,i32)-Box^u32)]
trait S10f {}
fn _10f<T: S10f>() {}
_10f::<fn(u32, i32) -> Box<u32>>();
println!(" 10f. fn^(u32,i32)-Box^u32 = fn(u32,i32)->Box<u32>: OK");
}
fn test_attr_caret_chain() {
#[batch_impl(#[allow(dead_code)]^Box^u32)]
trait S11a {}
fn _11a<T: S11a>() {}
_11a::<Box<u32>>();
println!(" 11a. #[allow(dead_code)]^Box^u32: OK");
#[batch_impl(#[allow(dead_code)]^[usize, isize])]
trait S11b {}
fn _11b<T: S11b>() {}
_11b::<usize>();
_11b::<isize>();
println!(" 11b. #[allow(dead_code)]^[usize, isize]: OK");
}
fn test_unit_target() {
#[batch_impl((), usize)]
trait S12a {}
fn _12a<T: S12a>() {}
_12a::<()>();
_12a::<usize>();
println!(" 12a. (,usize) = impl for () and usize: OK");
}
fn test_range_zero() {
#[batch_impl(()^0..1)]
trait S13a {}
fn _13a<T: S13a>() {}
_13a::<()>();
println!(" 13a. ()^0..1 = (): OK");
#[batch_impl(()^0..3)]
trait S13b {}
fn _13b<T: S13b>() {}
_13b::<()>();
_13b::<(i32,)>();
_13b::<(i32, i32)>();
println!(" 13b. ()^0..3 = (), (A,), (A,B): OK");
}
fn test_deep_caret() {
#[batch_impl(Box^Box^Vec^u32)]
trait S14a {}
fn _14a<T: S14a>() {}
_14a::<Box<Box<Vec<u32>>>>();
println!(" 14a. Box^Box^Vec^u32 = Box<Box<Vec<u32>>>: OK");
#[batch_impl(&^Box^Box^Box^u32)]
trait S14b {}
fn _14b<T: S14b>() {}
_14b::<&Box<Box<Box<u32>>>>();
println!(" 14b. &^Box^Box^Box^u32: OK");
}
fn test_hashmap_prefill() {
#[batch_impl(<K, V> HashMap<K>^V)]
trait S15a {}
fn _15a<T: S15a>() {}
_15a::<HashMap<u32, String>>();
println!(" 15a. <K,V> HashMap<K>^V = HashMap<K,V>: OK");
#[batch_impl(<K, V> HashMap<K>-V)]
trait S15b {}
fn _15b<T: S15b>() {}
_15b::<HashMap<u32, String>>();
println!(" 15b. <K,V> HashMap<K>-V = HashMap<K,V>: OK");
}
fn test_cartesian_3elem() {
#[batch_impl((u8, u16, u32)^2)]
trait S16a {}
fn _16a<T: S16a>() {}
_16a::<(u8, u8)>();
_16a::<(u8, u16)>();
_16a::<(u8, u32)>();
_16a::<(u16, u8)>();
_16a::<(u16, u16)>();
_16a::<(u16, u32)>();
_16a::<(u32, u8)>();
_16a::<(u32, u16)>();
_16a::<(u32, u32)>();
println!(" 16a. (u8,u16,u32)^2 = 9 impls: OK");
}
fn test_26_generics() {
#[batch_impl(()^26)]
trait S17a {}
fn _17a<T: S17a>() {}
_17a::<(
u8,
u16,
u32,
u64,
u128,
usize,
i8,
i16,
i32,
i64,
i128,
isize,
f32,
f64,
bool,
char,
String,
Vec<u8>,
Box<u8>,
Box<u16>,
Box<u32>,
Box<u64>,
Box<u128>,
Box<usize>,
Box<i8>,
Box<i16>,
)>();
println!(" 17a. ()^26 = (A..Z) 26 generic params: OK");
}
fn test_mixed_ref_ptr() {
#[batch_impl([&, *const, *mut]^Box^u32)]
trait S18a {}
fn _18a<T: S18a>() {}
_18a::<&Box<u32>>();
_18a::<*const Box<u32>>();
_18a::<*mut Box<u32>>();
println!(" 18a. [&, *const, *mut]^Box^u32 = 3 impls: OK");
}
fn test_fn_edge_cases() {
#[batch_impl(fn^(u32,i32)-(usize, isize))]
trait S19a {}
fn _19a<T: S19a>() {}
_19a::<fn(u32, i32) -> (usize, isize)>();
println!(" 19a. fn^(u32,i32)-(usize,isize) = fn->(usize,isize): OK");
#[batch_impl(fn^())]
trait S19b {}
fn _19b<T: S19b>() {}
_19b::<fn()>();
println!(" 19b. fn^() = fn(): OK");
#[batch_impl(fn^()-u32)]
trait S19c {}
fn _19c<T: S19c>() {}
_19c::<fn() -> u32>();
println!(" 19c. fn^()-u32 = fn()->u32: OK");
#[batch_impl(fn^(u32,i32)^i64)]
trait S19d {}
fn _19d<T: S19d>() {}
_19d::<fn(u32, i32, i64)>();
println!(" 19d. fn^(u32,i32)^i64 = fn(u32,i32,i64): OK");
}
fn test_caret_with_angle() {
#[batch_impl(HashMap^<u32, String>)]
trait S20a {}
fn _20a<T: S20a>() {}
_20a::<HashMap<u32, String>>();
println!(" 20a. HashMap^<u32,String> = HashMap<u32,String>: OK");
#[batch_impl(<K, V> HashMap<K>^V)]
trait S20b {}
fn _20b<T: S20b>() {}
_20b::<HashMap<u32, String>>();
println!(" 20b. <K,V> HashMap<K>^V = HashMap<K,V>: OK");
}
fn test_multi_modifier() {
#[batch_impl(self^Box<Vec<u32>>)]
trait S21a {}
fn _21a<T: S21a>() {}
_21a::<Box<Vec<u32>>>();
println!(" 21a. self^Box<Vec<u32>> = Box<Vec<u32>>: OK");
#[batch_impl([self, &mut]^Box<u32>)]
trait S21b {}
fn _21b<T: S21b>() {}
_21b::<Box<u32>>();
_21b::<&mut Box<u32>>();
println!(" 21b. [self,&mut]^Box<u32> = Box<u32>, &mut Box<u32>: OK");
}
fn test_long_dash_chain() {
#[batch_impl(()-u8-u16-u32-u64-usize)]
trait S22a {}
fn _22a<T: S22a>() {}
_22a::<(u8, u16, u32, u64, usize)>();
println!(" 22a. ()-u8-u16-u32-u64-usize = 5-tuple: OK");
#[batch_impl(()-[u8, u16]-[u32, u64]-usize)]
trait S22b {}
fn _22b<T: S22b>() {}
_22b::<(u8, u32, usize)>();
_22b::<(u8, u64, usize)>();
_22b::<(u16, u32, usize)>();
_22b::<(u16, u64, usize)>();
println!(" 22b. ()-[u8,u16]-[u32,u64]-usize = 4 impls: OK");
}
fn test_caret_dash_interaction() {
#[batch_impl(<K, V> HashMap^K-V)]
trait S23a {}
fn _23a<T: S23a>() {}
_23a::<HashMap<u32, String>>();
println!(" 23a. <K,V> HashMap^K-V = HashMap<K,V>: OK");
#[batch_impl(HashMap^<u32>-String)]
trait S23b {}
fn _23b<T: S23b>() {}
_23b::<HashMap<u32, String>>();
println!(" 23b. HashMap^<u32>-String = HashMap<u32,String>: OK");
#[batch_impl(unsafe^#[allow(dead_code)]^Box<u32>)]
unsafe trait S23c {}
fn _23c<T: S23c>() {}
_23c::<Box<u32>>();
println!(" 23c. unsafe^#[attr]^Box<u32>: OK");
#[batch_impl(unsafe^#[allow(dead_code)]^Box<u32> {
fn boxed_val(&self) -> &u32 { &**self }
})]
unsafe trait S23d {
fn boxed_val(&self) -> &u32;
}
fn _23d() {
let b = Box::new(42u32);
assert_eq!(S23d::boxed_val(&b), &42);
}
_23d();
println!(" 23d. unsafe^#[attr]^Box<u32> {{ body }}: OK");
#[batch_impl(#[allow(dead_code)]^#[allow(unused)]^Box<u32>)]
trait S23e {}
fn _23e<T: S23e>() {}
_23e::<Box<u32>>();
println!(" 23e. #[attr]^#[attr]^Box<u32>: OK");
#[batch_impl([Vec, Box]^u32)]
trait S23f {}
fn _23f<T: S23f>() {}
_23f::<Vec<u32>>();
_23f::<Box<u32>>();
println!(" 23f. [Vec,Box]^u32 = Vec<u32>, Box<u32>: OK");
#[batch_impl(fn^(u32,i32)-(usize, isize))]
trait S23g {}
fn _23g<T: S23g>() {}
_23g::<fn(u32, i32) -> (usize, isize)>();
println!(" 23g. fn^(u32,i32)-(usize,isize): OK");
#[batch_impl(fn^(u32,i32)^i64-usize)]
trait S23h {}
fn _23h<T: S23h>() {}
_23h::<fn(u32, i32, i64) -> usize>();
println!(" 23h. fn^(u32,i32)^i64-usize = fn(u32,i32,i64)->usize: OK");
}
use std::collections::HashMap;