use std::os::raw::c_void; extern "C" { #[link_name = "rust_tree_sitter_free"] pub fn free_ptr(ptr: *mut c_void); } pub struct CBufferIter { ptr: *mut T, count: usize, i: usize, } impl CBufferIter { pub unsafe fn new(ptr: *mut T, count: usize) -> Self { Self { ptr, count, i: 0 } } } impl Iterator for CBufferIter { type Item = T; fn next(&mut self) -> Option { let i = self.i; self.i += 1; if i >= self.count { None } else { Some(unsafe { *self.ptr.offset(i as isize) }) } } } impl Drop for CBufferIter { fn drop(&mut self) { unsafe { free_ptr(self.ptr as *mut c_void); } } }