@@ -2,67 +2,80 @@ use seq_macro::seq;
22
33use crate :: entity:: Entity ;
44use crate :: traits:: Archetype ;
5+ use crate :: archetype:: view:: * ;
56
67macro_rules! declare_iter_n {
7- ( $iter: ident, $iter_mut: ident, $n: literal) => {
8+ ( $iter: ident, $iter_mut: ident, $view : ident , $view_mut : ident , $ n: literal) => {
89 seq!( I in 0 ..$n {
9- pub struct $iter<' a, A : Archetype , #( T ~I , ) * > {
10+ pub struct $iter<' a, A : Archetype , V : $view< ' a , A , # ( T ~ I , ) * > , #( T ~I , ) * > {
1011 pub ( crate ) remaining: usize ,
1112 pub ( crate ) ptr_entity: * const Entity <A >,
1213 #( pub ( crate ) ptr_d~I : * const T ~I , ) *
13- pub ( crate ) phantom: std:: marker:: PhantomData <& ' a mut A >,
14+ pub ( crate ) phantom: std:: marker:: PhantomData <fn ( ) -> ( & ' a A , & ' a V ) >,
1415 }
1516
16- pub struct $iter_mut<' a, A : Archetype , #( T ~I , ) * > {
17+ pub struct $iter_mut<' a, A : Archetype , V : $view_mut< ' a , A , # ( T ~ I , ) * > , #( T ~I , ) * > {
1718 pub ( crate ) remaining: usize ,
1819 pub ( crate ) ptr_entity: * const Entity <A >,
1920 #( pub ( crate ) ptr_d~I : * mut T ~I , ) *
20- pub ( crate ) phantom: std:: marker:: PhantomData <& ' a mut A >,
21+ pub ( crate ) phantom: std:: marker:: PhantomData <fn ( ) -> ( & ' a A , & ' a V ) >,
2122 }
2223
23- impl <' a, A : Archetype + ' a, #( T ~I : ' a, ) * > Iterator for $iter<' a, A , #( T ~I , ) * > {
24- type Item = ( & ' a Entity <A >, #( & ' a T ~I , ) * ) ;
24+ impl <
25+ ' a,
26+ A : Archetype + ' a,
27+ V : $view<' a, A , #( T ~I , ) * > + ' a,
28+ #( T ~I : ' a, ) *
29+ > Iterator for $iter<' a, A , V , #( T ~I , ) * > {
30+ type Item = V ;
2531
2632 fn next( & mut self ) -> Option <Self :: Item > {
2733 if self . remaining == 0 {
2834 return None ;
2935 }
3036
3137 unsafe {
32- let result = ( & * self . ptr_entity, #( & * self . ptr_d~I , ) * ) ;
38+ let entity = & * self . ptr_entity;
39+ #( let arg~I = & * self . ptr_d~I ; ) *
3340
3441 self . ptr_entity = self . ptr_entity. offset( 1 ) ;
3542 #( self . ptr_d~I = self . ptr_d~I . offset( 1 ) ; ) *
3643
3744 self . remaining -= 1 ;
38- Some ( result )
45+ Some ( V :: new ( entity , # ( arg~ I , ) * ) )
3946 }
4047 }
4148 }
4249
43- impl <' a, A : Archetype + ' a, #( T ~I : ' a, ) * > Iterator for $iter_mut<' a, A , #( T ~I , ) * > {
44- type Item = ( & ' a Entity <A >, #( & ' a mut T ~I , ) * ) ;
50+ impl <
51+ ' a,
52+ A : Archetype + ' a,
53+ V : $view_mut<' a, A , #( T ~I , ) * > + ' a,
54+ #( T ~I : ' a, ) *
55+ > Iterator for $iter_mut<' a, A , V , #( T ~I , ) * > {
56+ type Item = V ;
4557
4658 fn next( & mut self ) -> Option <Self :: Item > {
4759 if self . remaining == 0 {
4860 return None ;
4961 }
5062
5163 unsafe {
52- let result = ( & * self . ptr_entity, #( & mut * self . ptr_d~I , ) * ) ;
64+ let entity = & * self . ptr_entity;
65+ #( let arg~I = & mut * self . ptr_d~I ; ) *
5366
5467 self . ptr_entity = self . ptr_entity. offset( 1 ) ;
5568 #( self . ptr_d~I = self . ptr_d~I . offset( 1 ) ; ) *
5669
5770 self . remaining -= 1 ;
58- Some ( result )
71+ Some ( V :: new ( entity , # ( arg~ I , ) * ) )
5972 }
6073 }
6174 }
6275 } ) ;
6376 } ;
6477}
6578
66- seq ! ( N in 1 ..=16 { declare_iter_n!( Iter ~N , IterMut ~N , N ) ; } ) ;
79+ seq ! ( N in 1 ..=16 { declare_iter_n!( Iter ~N , IterMut ~N , View ~ N , ViewMut ~ N , N ) ; } ) ;
6780#[ cfg( feature = "32_components" ) ]
68- seq ! ( N in 17 ..=32 { declare_iter_n!( Iter ~N , IterMut ~N , N ) ; } ) ;
81+ seq ! ( N in 17 ..=32 { declare_iter_n!( Iter ~N , IterMut ~N , View ~ N , ViewMut ~ N , N ) ; } ) ;
0 commit comments