Function voluntary_servitude::ffi::vs_iter_index
source · #[no_mangle]
pub unsafe extern "C" fn vs_iter_index(
iter: *const VSIter<'_, *const c_void>
) -> usize
Expand description
Returns current iterator index
Returns 0 if pointer to VSIter
is NULL
Warning: UB if pointer to VSIter
is invalid
Rust
use std::ptr::null_mut;
use voluntary_servitude::ffi::*;
unsafe {
let vs = vs_new();
let data: [i32; 3] = [4, 9, 8];
assert_eq!(vs_append(vs, &data[0] as *const i32 as *const c_void), 0);
assert_eq!(vs_append(vs, &data[1] as *const i32 as *const c_void), 0);
assert_eq!(vs_append(vs, &data[2] as *const i32 as *const c_void), 0);
let iter = vs_iter(vs);
assert_eq!(vs_iter_index(iter), 0);
assert_eq!(*(vs_iter_next(iter) as *const i32), 4);
assert_eq!(*(vs_iter_next(iter) as *const i32), 9);
assert_eq!(*(vs_iter_next(iter) as *const i32), 8);
assert_eq!(vs_iter_index(iter), 3);
assert!(vs_iter_next(iter).is_null());
assert_eq!(vs_iter_index(iter), vs_iter_len(iter));
assert_eq!(vs_iter_destroy(iter), 0);
assert_eq!(vs_destroy(vs), 0);
// 0 index on NULL pointer
assert_eq!(vs_iter_index(null_mut()), 0);
}
C
#include<assert.h>
#include "../include/voluntary_servitude.h"
int main(int argc, char **argv) {
vs_t * vs = vs_new();
const unsigned int data[3] = { 4, 9, 8 };
assert(vs_append(vs, (void *) data) == 0);
assert(vs_append(vs, (void *) (data + 1)) == 0);
assert(vs_append(vs, (void *) (data + 2)) == 0);
vs_iter_t * iter = vs_iter(vs);
assert(vs_iter_index(iter) == 0);
assert(*(unsigned int *) vs_iter_next(iter) == 4);
assert(*(unsigned int *) vs_iter_next(iter) == 9);
assert(*(unsigned int *) vs_iter_next(iter) == 8);
assert(vs_iter_index(iter) == 3);
assert(vs_iter_next(iter) == NULL);
assert(vs_iter_index(iter) == vs_iter_len(iter));
assert(vs_iter_destroy(iter) == 0);
assert(vs_destroy(vs) == 0);
// 0 index on NULL pointer
assert(vs_iter_index(NULL) == 0);
return 0;
}