Skip to content

Commit 84b0b49

Browse files
committed
Replace built-in iteration with iterator adapter for WrappedTskArray
1 parent 1823499 commit 84b0b49

File tree

2 files changed

+35
-45
lines changed

2 files changed

+35
-45
lines changed

src/_macros.rs

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -145,31 +145,9 @@ macro_rules! index_for_wrapped_tsk_array_type {
145145
};
146146
}
147147

148-
macro_rules! iterator_for_wrapped_tsk_array_type {
149-
($name: ty, $item: ty) => {
150-
impl Iterator for $name {
151-
type Item = $item;
152-
153-
fn next(&mut self) -> Option<$item> {
154-
if self.idx_ >= self.len_ as crate::tsk_id_t {
155-
self.idx_ = -1;
156-
}
157-
self.idx_ += 1;
158-
159-
if self.idx_ < self.len_ as crate::tsk_id_t {
160-
Some(unsafe { *self.array.offset(self.idx_ as isize) })
161-
} else {
162-
None
163-
}
164-
}
165-
}
166-
};
167-
}
168-
169148
macro_rules! wrapped_tsk_array_traits {
170149
($name: ty, $index:ty, $output: ty) => {
171150
index_for_wrapped_tsk_array_type!($name, $index, $output);
172-
iterator_for_wrapped_tsk_array_type!($name, $output);
173151
};
174152
}
175153

src/ffi.rs

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,48 @@ pub trait TskitTypeAccess<T> {
1212
/// arrays.
1313
#[derive(Copy, Clone)]
1414
pub(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

3758
wrapped_tsk_array_traits!(TskIdArray, crate::tsk_id_t, crate::tsk_id_t);
3859
wrapped_tsk_array_traits!(Tskf64Array, crate::tsk_id_t, f64);
@@ -58,6 +79,7 @@ pub(crate) trait WrapTskitConsumingType<T, C> {
5879
mod 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

Comments
 (0)