@@ -12,27 +12,48 @@ pub trait TskitTypeAccess<T> {
1212/// arrays.
1313#[ derive( Copy , Clone ) ]
1414pub ( crate ) struct WrappedTskArray < T > {
15- array : T ,
15+ array : * const T ,
1616 len_ : crate :: tsk_size_t ,
17- idx_ : crate :: tsk_id_t ,
1817}
1918
20- impl < T > WrappedTskArray < T > {
21- pub fn new ( array : T , len : crate :: tsk_size_t ) -> Self {
22- Self {
23- array,
24- len_ : len,
25- idx_ : -1 ,
19+ pub ( crate ) struct WrappedTskArrayIter < ' a , T : Copy + ' a > {
20+ inner : & ' a WrappedTskArray < T > ,
21+ pos : crate :: tsk_size_t ,
22+ }
23+
24+ impl < ' a , T : Copy > Iterator for WrappedTskArrayIter < ' a , T > {
25+ type Item = T ;
26+
27+ fn next ( & mut self ) -> Option < Self :: Item > {
28+ if self . pos >= self . inner . len_ {
29+ None
30+ } else {
31+ let rv = Some ( unsafe { * self . inner . array . offset ( self . pos as isize ) as T } ) ;
32+ self . pos += 1 ;
33+ rv
2634 }
2735 }
36+ }
37+
38+ impl < T : Copy > WrappedTskArray < T > {
39+ pub fn new ( array : * const T , len : crate :: tsk_size_t ) -> Self {
40+ Self { array, len_ : len }
41+ }
2842
2943 pub fn len ( & self ) -> crate :: tsk_size_t {
3044 self . len_
3145 }
46+
47+ pub fn iter < ' a > ( & ' a self ) -> WrappedTskArrayIter < ' a , T > {
48+ WrappedTskArrayIter {
49+ inner : self ,
50+ pos : 0 ,
51+ }
52+ }
3253}
3354
34- pub ( crate ) type TskIdArray = WrappedTskArray < * const crate :: tsk_id_t > ;
35- pub ( crate ) type Tskf64Array = WrappedTskArray < * const f64 > ;
55+ pub ( crate ) type TskIdArray = WrappedTskArray < crate :: tsk_id_t > ;
56+ pub ( crate ) type Tskf64Array = WrappedTskArray < f64 > ;
3657
3758wrapped_tsk_array_traits ! ( TskIdArray , crate :: tsk_id_t, crate :: tsk_id_t) ;
3859wrapped_tsk_array_traits ! ( Tskf64Array , crate :: tsk_id_t, f64 ) ;
@@ -58,6 +79,7 @@ pub(crate) trait WrapTskitConsumingType<T, C> {
5879mod tests {
5980 use super :: * ;
6081 use crate :: bindings as ll_bindings;
82+ use crate :: tsk_size_t;
6183 use ll_bindings:: tsk_table_collection_free;
6284
6385 pub struct TableCollectionMock {
@@ -110,25 +132,15 @@ mod tests {
110132 } ;
111133 panic_on_tskit_error ! ( rv) ;
112134
113- let mut a = TskIdArray :: new ( unsafe { ( * t. as_ptr ( ) ) . edges . child } , 1 ) ;
135+ let a = TskIdArray :: new ( unsafe { ( * t. as_ptr ( ) ) . edges . child } , 1 ) ;
114136 assert_eq ! ( a. len( ) , 1 ) ;
115137 assert_eq ! ( a[ 0 ] , 17 ) ;
116138
117- assert_eq ! ( a. next( ) , Some ( 17 ) ) ;
118- assert_eq ! ( a. next( ) , None ) ;
119-
120139 let mut v = vec ! [ ] ;
121- for i in & mut a {
122- v. push ( i) ;
123- }
124- assert_eq ! ( v. len( ) , 1 ) ;
125- assert_eq ! ( v[ 0 ] , 17 ) ;
126-
127- v = vec ! [ ] ;
128- for i in & mut a {
140+ for i in a. iter ( ) {
129141 v. push ( i) ;
130142 }
131- assert_eq ! ( v. len( ) , 1 ) ;
143+ assert_eq ! ( v. len( ) as tsk_size_t , a . len ( ) ) ;
132144 assert_eq ! ( v[ 0 ] , 17 ) ;
133145 }
134146
0 commit comments