1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
use crate::ops::{Decrement, Increment, Indirection};
use crate::{CppBox, CppDeletable, Ref};
use std::os::raw::c_char;
pub struct CppIterator<T1, T2>
where
T1: CppDeletable,
T2: CppDeletable,
{
begin: CppBox<T1>,
end: CppBox<T2>,
}
pub unsafe fn cpp_iter<T1, T2>(begin: CppBox<T1>, end: CppBox<T2>) -> CppIterator<T1, T2>
where
T1: CppDeletable,
T2: CppDeletable,
{
CppIterator { begin, end }
}
impl<T1, T2> Iterator for CppIterator<T1, T2>
where
T1: CppDeletable + PartialEq<Ref<T2>> + Indirection + Increment,
T2: CppDeletable,
{
type Item = <T1 as Indirection>::Output;
fn next(&mut self) -> Option<Self::Item> {
unsafe {
if self.begin == self.end.as_ref() {
None
} else {
let inner = &mut *self.begin.as_mut_raw_ptr();
let value = inner.indirection();
let inner = &mut *self.begin.as_mut_raw_ptr();
inner.inc();
Some(value)
}
}
}
}
impl<T1, T2> DoubleEndedIterator for CppIterator<T1, T2>
where
T1: CppDeletable + PartialEq<Ref<T2>> + Indirection + Increment,
T2: CppDeletable + Decrement + Indirection<Output = <T1 as Indirection>::Output>,
{
fn next_back(&mut self) -> Option<Self::Item> {
unsafe {
if self.begin == self.end.as_ref() {
None
} else {
let inner = &mut *self.end.as_mut_raw_ptr();
inner.dec();
let inner = &mut *self.end.as_mut_raw_ptr();
let value = inner.indirection();
Some(value)
}
}
}
}
pub trait EndPtr {
type Item;
fn end_ptr(&self) -> *const Self::Item;
}
impl<'a, T> EndPtr for &'a [T] {
type Item = T;
fn end_ptr(&self) -> *const T {
unsafe { self.as_ptr().add(self.len()) }
}
}
impl<'a> EndPtr for &'a str {
type Item = c_char;
fn end_ptr(&self) -> *const c_char {
unsafe { self.as_ptr().add(self.len()) as *const c_char }
}
}