106_scan_allpackage/eg/
hv_iter0.rs

1use libperl_sys::*;
2use libperl_rs::Perl;
3
4pub struct HvIter<'a> {
5    perl: &'a Perl,
6    hv: *mut HV,
7    he: *mut HE,
8}
9
10impl<'a> HvIter<'a> {
11    pub fn new(perl: &'a Perl, hv: *mut HV) -> HvIter<'a> {
12        perl.hv_iterinit(hv);
13        HvIter {perl, hv, he: std::ptr::null_mut()}
14    }
15}
16
17impl<'a> Iterator for HvIter<'a> {
18    type Item = (String, *mut SV);
19    
20    fn next(&mut self) -> Option<Self::Item> {
21        self.he = self.perl.hv_iternext(self.hv);
22        if !self.he.is_null() {
23            let name = self.perl.hv_iterkey(self.he);
24            let value = self.perl.hv_iterval(self.hv, self.he);
25            Some((name, value))
26        } else {
27            None
28        }
29    }
30}