Skip to content

Commit f9918e7

Browse files
committed
fix bug in ListIter::nth
1 parent cb5b6ea commit f9918e7

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

capnp/src/traits.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,9 @@ impl <U, T : IndexMove<u32, U>> ::std::iter::Iterator for ListIter<T, U> {
138138

139139
fn nth(&mut self, p: usize) -> Option<U>{
140140
if p < self.size as usize {
141-
self.index = p as u32;
141+
self.index += p as u32;
142142
let result = self.list.index_move(self.index);
143+
self.index += 1;
143144
Some(result)
144145
} else {
145146
None

capnpc/test/test.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1421,4 +1421,45 @@ mod tests {
14211421
let substruct: test_all_types::Reader = pointers.get(2).get_as().unwrap();
14221422
::test_util::CheckTestMessage::check_test_message(substruct);
14231423
}
1424+
1425+
#[test]
1426+
fn struct_list_iterator() {
1427+
use test_capnp::test_all_types;
1428+
let mut message = message::Builder::new_default();
1429+
{
1430+
let root: test_all_types::Builder = message.init_root();
1431+
let mut struct_list = root.init_struct_list(6);
1432+
let mut t0 = struct_list.reborrow().get(0);
1433+
t0.set_u_int32_field(0);
1434+
1435+
let mut t1 = struct_list.reborrow().get(1);
1436+
t1.set_u_int32_field(1);
1437+
1438+
let mut t2 = struct_list.reborrow().get(2);
1439+
t2.set_u_int32_field(2);
1440+
1441+
let mut t3 = struct_list.reborrow().get(3);
1442+
t3.set_u_int32_field(3);
1443+
1444+
let mut t4 = struct_list.reborrow().get(4);
1445+
t4.set_u_int32_field(4);
1446+
1447+
let mut t5 = struct_list.reborrow().get(5);
1448+
t5.set_u_int32_field(5);
1449+
}
1450+
1451+
let reader = message.get_root_as_reader::<test_all_types::Reader>().unwrap();
1452+
let structs = reader.get_struct_list().unwrap();
1453+
1454+
let mut iter = structs.iter();
1455+
assert_eq!(3, iter.nth(3).unwrap().get_u_int32_field());
1456+
assert_eq!(4, iter.nth(0).unwrap().get_u_int32_field());
1457+
assert_eq!(5, iter.nth(0).unwrap().get_u_int32_field());
1458+
1459+
let mut c = 2;
1460+
for s in structs.iter().skip(2) {
1461+
assert_eq!(c, s.get_u_int32_field());
1462+
c += 1;
1463+
}
1464+
}
14241465
}

0 commit comments

Comments
 (0)