flann 0.1.0

Bindings for the FLANN library
use enums::{Algorithm, CentersInit, Checks, LogLevel};
use raw;
use std::os::raw::c_long;

const DEFAULT_REBUILD_THRESHOLD: f32 = 2.0;

#[derive(Debug, Clone)]
pub struct Parameters {
    pub algorithm: Algorithm,
    pub checks: Checks,
    pub eps: f32,
    pub sorted: i32,
    pub max_neighbors: i32,
    pub cores: i32,
    pub trees: i32,
    pub leaf_max_size: i32,
    pub branching: i32,
    pub iterations: i32,
    pub centers_init: CentersInit,
    pub cb_index: f32,
    pub target_precision: f32,
    pub build_weight: f32,
    pub memory_weight: f32,
    pub sample_fraction: f32,
    pub table_number: u32,
    pub key_size: u32,
    pub multi_probe_level: u32,
    pub log_level: LogLevel,
    pub random_seed: c_long,
    pub rebuild_threshold: f32,
}

impl Default for Parameters {
    fn default() -> Parameters {
        Parameters::from_raw(unsafe { raw::DEFAULT_FLANN_PARAMETERS })
            .expect("Illegal default FLANN parameters in C bindings")
    }
}

impl Parameters {
    pub fn from_raw(v: raw::FLANNParameters) -> Result<Parameters, String> {
        Ok(Parameters {
            algorithm: Algorithm::from_raw(v.algorithm)
                .ok_or_else(|| format!("Illegal algorithm enum value: {}", v.algorithm))?,
            checks: Checks::from_raw(v.checks),
            eps: v.eps,
            sorted: v.sorted,
            max_neighbors: v.max_neighbors,
            cores: v.cores,
            trees: v.trees,
            leaf_max_size: v.leaf_max_size,
            branching: v.branching,
            iterations: v.iterations,
            centers_init: CentersInit::from_raw(v.centers_init)
                .ok_or_else(|| format!("Illegal centers init enum value: {}", v.centers_init))?,
            cb_index: v.cb_index,
            target_precision: v.target_precision,
            build_weight: v.build_weight,
            memory_weight: v.memory_weight,
            sample_fraction: v.sample_fraction,
            table_number: v.table_number_,
            key_size: v.key_size_,
            multi_probe_level: v.multi_probe_level_,
            log_level: LogLevel::from_raw(v.log_level)
                .ok_or_else(|| format!("Illegal log level enum value: {}", v.log_level))?,
            random_seed: v.random_seed,
            rebuild_threshold: DEFAULT_REBUILD_THRESHOLD,
        })
    }
}

impl<'a> Into<raw::FLANNParameters> for &'a Parameters {
    fn into(self) -> raw::FLANNParameters {
        raw::FLANNParameters {
            algorithm: self.algorithm.as_raw(),
            checks: self.checks.as_raw(),
            eps: self.eps,
            sorted: self.sorted,
            max_neighbors: self.max_neighbors,
            cores: self.cores,
            trees: self.trees,
            leaf_max_size: self.leaf_max_size,
            branching: self.branching,
            iterations: self.iterations,
            centers_init: self.centers_init.as_raw(),
            cb_index: self.cb_index,
            target_precision: self.target_precision,
            build_weight: self.build_weight,
            memory_weight: self.memory_weight,
            sample_fraction: self.sample_fraction,
            table_number_: self.table_number,
            key_size_: self.key_size,
            multi_probe_level_: self.multi_probe_level,
            log_level: self.log_level.as_raw(),
            random_seed: self.random_seed,
        }
    }
}

impl Into<raw::FLANNParameters> for Parameters {
    fn into(self) -> raw::FLANNParameters {
        (&self).into()
    }
}