#[ allow( unused_imports ) ]
use super :: *;
#[ allow( unused_imports ) ]
use test_tools ::a_id;
#[ the_module ::clone_dyn ]
pub trait IterTrait< 'a, T >
where
T: 'a,
Self: Iterator< Item = T > + ExactSizeIterator< Item = T > + DoubleEndedIterator,
{
}
impl< 'a, T, I > IterTrait< 'a, T > for I
where
T: 'a,
Self: Iterator< Item = T > + ExactSizeIterator< Item = T > + DoubleEndedIterator,
Self: the_module ::CloneDyn,
{
}
pub fn get_iter< 'a >( src: Option< &'a Vec< i32 > > ) -> Box< dyn IterTrait< 'a, &'a i32 > + 'a >
{
match &src
{
Some( src ) => Box ::new( src.iter() ),
_ => Box ::new( core ::iter ::empty() ),
}
}
#[ test ]
fn empty_iterator_none_case()
{
let iter = get_iter( None );
let cloned = iter.clone();
let original_count = iter.count();
let cloned_count = cloned.count();
assert_eq!( original_count, 0, "Original empty iterator should have 0 elements" );
assert_eq!( cloned_count, 0, "Cloned empty iterator should have 0 elements" );
}
#[ test ]
fn empty_vector_case()
{
let data = vec![];
let iter = get_iter( Some( &data ) );
let cloned = iter.clone();
let original_count = iter.count();
let cloned_count = cloned.count();
assert_eq!( original_count, 0, "Original empty vec iterator should have 0 elements" );
assert_eq!( cloned_count, 0, "Cloned empty vec iterator should have 0 elements" );
}
#[ test ]
fn single_element_iterator()
{
let data = vec![ 42 ];
let iter = get_iter( Some( &data ) );
let cloned = iter.clone();
let cloned_values: Vec< _ > = cloned.copied().collect();
assert_eq!( cloned_values, vec![ 42 ], "Cloned iterator should have single element" );
let original_values: Vec< _ > = iter.copied().collect();
assert_eq!( original_values, vec![ 42 ], "Original iterator should still have single element" );
}
#[ test ]
fn clone_independence_multi_element()
{
let data = vec![ 1, 2, 3, 4, 5 ];
let iter = get_iter( Some( &data ) );
let cloned = iter.clone();
let cloned_values: Vec< _ > = cloned.copied().collect();
assert_eq!( cloned_values, vec![ 1, 2, 3, 4, 5 ], "Cloned iterator should have all elements" );
let original_values: Vec< _ > = iter.copied().collect();
assert_eq!( original_values, vec![ 1, 2, 3, 4, 5 ], "Original iterator should be unaffected by clone consumption" );
}
#[ test ]
fn multiple_consecutive_clones()
{
let data = vec![ 10, 20, 30 ];
let iter1 = get_iter( Some( &data ) );
let iter2 = iter1.clone();
let iter3 = iter2.clone();
let iter4 = iter3.clone();
let values1: Vec< _ > = iter1.copied().collect();
let values2: Vec< _ > = iter2.copied().collect();
let values3: Vec< _ > = iter3.copied().collect();
let values4: Vec< _ > = iter4.copied().collect();
assert_eq!( values1, vec![ 10, 20, 30 ], "First iterator should have all elements" );
assert_eq!( values2, vec![ 10, 20, 30 ], "Second iterator (clone) should have all elements" );
assert_eq!( values3, vec![ 10, 20, 30 ], "Third iterator (clone-of-clone) should have all elements" );
assert_eq!( values4, vec![ 10, 20, 30 ], "Fourth iterator (clone-of-clone-of-clone) should have all elements" );
}
#[ test ]
fn clone_empty_iterator_multiple_times()
{
let iter1 = get_iter( None );
let iter2 = iter1.clone();
let iter3 = iter2.clone();
assert_eq!( iter1.count(), 0, "Original empty iterator should have 0 elements" );
assert_eq!( iter2.count(), 0, "First clone of empty iterator should have 0 elements" );
assert_eq!( iter3.count(), 0, "Clone-of-clone of empty iterator should have 0 elements" );
}
#[ test ]
fn auto_trait_send()
{
let data = [ 1, 2, 3 ];
let iter: Box< dyn IterTrait< '_, &i32 > + Send > = Box ::new( data.iter() );
let cloned = iter.clone();
let original_values: Vec< _ > = iter.copied().collect();
let cloned_values: Vec< _ > = cloned.copied().collect();
assert_eq!( original_values, vec![ 1, 2, 3 ], "Original Send variant should work" );
assert_eq!( cloned_values, vec![ 1, 2, 3 ], "Cloned Send variant should work" );
}
#[ test ]
fn auto_trait_sync()
{
let data = [ 1, 2, 3 ];
let iter: Box< dyn IterTrait< '_, &i32 > + Sync > = Box ::new( data.iter() );
let cloned = iter.clone();
let original_values: Vec< _ > = iter.copied().collect();
let cloned_values: Vec< _ > = cloned.copied().collect();
assert_eq!( original_values, vec![ 1, 2, 3 ], "Original Sync variant should work" );
assert_eq!( cloned_values, vec![ 1, 2, 3 ], "Cloned Sync variant should work" );
}
#[ test ]
fn auto_trait_send_sync()
{
let data = [ 1, 2, 3 ];
let iter: Box< dyn IterTrait< '_, &i32 > + Send + Sync > = Box ::new( data.iter() );
let cloned = iter.clone();
let original_values: Vec< _ > = iter.copied().collect();
let cloned_values: Vec< _ > = cloned.copied().collect();
assert_eq!( original_values, vec![ 1, 2, 3 ], "Original Send+Sync variant should work" );
assert_eq!( cloned_values, vec![ 1, 2, 3 ], "Cloned Send+Sync variant should work" );
}
#[ test ]
fn large_iterator_cloning()
{
let data: Vec< i32 > = ( 0..10_000 ).collect();
let iter = get_iter( Some( &data ) );
let cloned = iter.clone();
let original_count = iter.count();
let cloned_count = cloned.count();
assert_eq!( original_count, 10_000, "Original large iterator should have 10k elements" );
assert_eq!( cloned_count, 10_000, "Cloned large iterator should have 10k elements" );
}