copt-solver 0.1.1

An unofficial Rust API for COPT (Cardinal Optimizer)
use crate::util;
use copt_sys::{DoubleParam, IntParam};
use std::ffi::CString;

pub trait Param: Sized + Into<CString> {
    type Out;
    type Buf: util::Init + util::Into<Self::Out> + util::AsRawPtr<Self::RawFrom>;
    type RawFrom;
    type RawTo: util::FromRaw<Self::Out>;

    unsafe fn get_param(
        model: *mut copt_sys::copt_prob,
        paramname: copt_sys::c_str,
        value: Self::RawFrom,
    ) -> std::ffi::c_int;

    unsafe fn set_param(
        model: *mut copt_sys::copt_prob,
        paramname: copt_sys::c_str,
        value: Self::RawTo,
    ) -> std::ffi::c_int;
}

impl Param for IntParam {
    type Out = i32;
    type Buf = std::ffi::c_int;
    type RawFrom = *mut std::ffi::c_int;
    type RawTo = std::ffi::c_int;

    unsafe fn get_param(
        model: *mut copt_sys::copt_prob,
        paramname: copt_sys::c_str,
        value: *mut std::ffi::c_int,
    ) -> std::ffi::c_int {
        copt_sys::COPT_GetIntParam(model, paramname, value)
    }

    unsafe fn set_param(
        model: *mut copt_sys::copt_prob,
        paramname: copt_sys::c_str,
        value: std::ffi::c_int,
    ) -> std::ffi::c_int {
        copt_sys::COPT_SetIntParam(model, paramname, value)
    }
}

impl Param for DoubleParam {
    type Out = f64;
    type Buf = std::ffi::c_double;
    type RawFrom = *mut std::ffi::c_double;
    type RawTo = std::ffi::c_double;

    unsafe fn get_param(
        model: *mut copt_sys::copt_prob,
        paramname: copt_sys::c_str,
        value: *mut std::ffi::c_double,
    ) -> std::ffi::c_int {
        copt_sys::COPT_GetDblParam(model, paramname, value)
    }

    unsafe fn set_param(
        model: *mut copt_sys::copt_prob,
        paramname: copt_sys::c_str,
        value: std::ffi::c_double,
    ) -> std::ffi::c_int {
        copt_sys::COPT_SetDblParam(model, paramname, value)
    }
}