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
use ncnn_bind::*;
use std::os::raw::c_int;

pub struct Option {
    ptr: ncnn_option_t,
}

impl Option {
    pub fn new() -> Option {
        let ptr;
        unsafe {
            ptr = ncnn_option_create();
        }
        Option { ptr }
    }

    pub fn set_num_threads(&mut self, num_threads: u32) {
        unsafe {
            ncnn_option_set_num_threads(self.ptr, num_threads as c_int);
        }
    }

    pub fn get_num_threads(&self) -> u32 {
        unsafe { ncnn_option_get_num_threads(self.ptr) as u32 }
    }

    pub fn set_vulkan_compute(&mut self, enabled: bool) {
        unsafe {
            ncnn_option_set_use_vulkan_compute(self.ptr, enabled as c_int);
        }
    }

    pub fn get_vulkan_compute(&self) -> bool {
        unsafe { ncnn_option_get_use_vulkan_compute(self.ptr) != 0 }
    }

    pub(crate) fn ptr(&self) -> ncnn_option_t {
        self.ptr
    }
}

impl Drop for Option {
    fn drop(&mut self) {
        unsafe {
            ncnn_option_destroy(self.ptr);
        }
    }
}

#[cfg(test)]
mod tests {
    #[test]
    fn get_cpu_info() {
        use crate::option::*;
        let mut opt = Option::new();
        opt.set_num_threads(4);
        assert_eq!(4, opt.get_num_threads());
    }
}