1
1
//! Define traits related to wrapping tskit stuff
2
2
3
- /// Indexable, iterable wrapper around C
4
- /// arrays.
5
- #[ derive( Copy , Clone ) ]
6
- pub struct WrappedTskArray < T > {
7
- array : * const T ,
8
- len_ : crate :: tsk_size_t ,
9
- }
10
-
11
- pub struct WrappedTskArrayIter < ' a , T : Copy + ' a > {
12
- inner : & ' a WrappedTskArray < T > ,
13
- pos : crate :: tsk_size_t ,
14
- }
15
-
16
- impl < ' a , T : Copy > Iterator for WrappedTskArrayIter < ' a , T > {
17
- type Item = T ;
18
-
19
- fn next ( & mut self ) -> Option < Self :: Item > {
20
- if self . pos >= self . inner . len_ {
21
- None
22
- } else {
23
- let rv = Some ( unsafe { * self . inner . array . offset ( self . pos as isize ) as T } ) ;
24
- self . pos += 1 ;
25
- rv
26
- }
27
- }
28
- }
29
-
30
- impl < T : Copy > WrappedTskArray < T > {
31
- pub ( crate ) fn new ( array : * const T , len : crate :: tsk_size_t ) -> Self {
32
- Self { array, len_ : len }
33
- }
34
-
35
- pub fn len ( & self ) -> crate :: tsk_size_t {
36
- self . len_
37
- }
38
-
39
- pub fn is_empty ( & self ) -> bool {
40
- self . len_ == 0
41
- }
42
-
43
- /// # Safety
44
- ///
45
- /// This function returns the raw C pointer,
46
- /// and is thus unsafe.
47
- pub fn as_ptr ( & self ) -> * const T {
48
- self . array
49
- }
50
-
51
- pub fn iter ( & self ) -> WrappedTskArrayIter < T > {
52
- WrappedTskArrayIter {
53
- inner : self ,
54
- pos : 0 ,
55
- }
56
- }
57
- }
58
-
59
- pub ( crate ) type TskIdArray = WrappedTskArray < crate :: tsk_id_t > ;
60
- pub ( crate ) type Tskf64Array = WrappedTskArray < f64 > ;
61
-
62
- wrapped_tsk_array_traits ! ( TskIdArray , crate :: tsk_id_t, crate :: tsk_id_t) ;
63
- wrapped_tsk_array_traits ! ( Tskf64Array , crate :: tsk_id_t, f64 ) ;
64
-
65
3
/// Wrap a tskit type
66
4
pub ( crate ) trait WrapTskitType < T > {
67
5
/// Encapsulate tsk_foo_t and return rust
@@ -83,7 +21,6 @@ pub(crate) trait WrapTskitConsumingType<T, C> {
83
21
mod tests {
84
22
use super :: * ;
85
23
use crate :: bindings as ll_bindings;
86
- use crate :: tsk_size_t;
87
24
use crate :: TskitTypeAccess ;
88
25
use ll_bindings:: tsk_table_collection_free;
89
26
@@ -119,56 +56,4 @@ mod tests {
119
56
let t = TableCollectionMock :: new ( 10. ) ;
120
57
assert_eq ! ( t. sequence_length( ) as i64 , 10 ) ;
121
58
}
122
-
123
- #[ test]
124
- fn test_u32_array_wrapper ( ) {
125
- let mut t = TableCollectionMock :: new ( 10. ) ;
126
-
127
- let rv = unsafe {
128
- ll_bindings:: tsk_edge_table_add_row (
129
- & mut ( * t. as_mut_ptr ( ) ) . edges ,
130
- 0. ,
131
- 10. ,
132
- 0 ,
133
- 17 ,
134
- std:: ptr:: null ( ) ,
135
- 0 ,
136
- )
137
- } ;
138
- panic_on_tskit_error ! ( rv) ;
139
-
140
- let a = TskIdArray :: new ( unsafe { ( * t. as_ptr ( ) ) . edges . child } , 1 ) ;
141
- assert_eq ! ( a. len( ) , 1 ) ;
142
- assert_eq ! ( a[ 0 ] , 17 ) ;
143
-
144
- let mut v = vec ! [ ] ;
145
- for i in a. iter ( ) {
146
- v. push ( i) ;
147
- }
148
- assert_eq ! ( v. len( ) as tsk_size_t, a. len( ) ) ;
149
- assert_eq ! ( v[ 0 ] , 17 ) ;
150
- }
151
-
152
- #[ should_panic]
153
- #[ test]
154
- fn test_u32_array_wrapper_panic ( ) {
155
- let mut t = TableCollectionMock :: new ( 10. ) ;
156
-
157
- let rv = unsafe {
158
- ll_bindings:: tsk_edge_table_add_row (
159
- & mut ( * t. as_mut_ptr ( ) ) . edges ,
160
- 0. ,
161
- 10. ,
162
- 0 ,
163
- 17 ,
164
- std:: ptr:: null ( ) ,
165
- 0 ,
166
- )
167
- } ;
168
- panic_on_tskit_error ! ( rv) ;
169
-
170
- let a = TskIdArray :: new ( unsafe { ( * t. as_ptr ( ) ) . edges . child } , 1 ) ;
171
- assert_eq ! ( a. len( ) , 1 ) ;
172
- assert_eq ! ( a[ 1 ] , 17 ) ;
173
- }
174
59
}
0 commit comments