extern crate ndarray;
#[macro_use]
extern crate tvm;

use ndarray::Array;
use tvm::{
  ffi::runtime::DLTensor,
  runtime::{Module, SystemLibModule},
};

fn main() {
  let syslib = SystemLibModule::default();
  let add = syslib
    .get_function("default_function")
    .expect("main function not found");
  let mut a = Array::from_vec(vec![1f32, 2., 3., 4.]);
  let mut b = Array::from_vec(vec![1f32, 0., 1., 0.]);
  let mut c = Array::from_vec(vec![0f32; 4]);
  let e = Array::from_vec(vec![2f32, 2., 4., 4.]);
  let mut a_dl: DLTensor = (&mut a).into();
  let mut b_dl: DLTensor = (&mut b).into();
  let mut c_dl: DLTensor = (&mut c).into();
  call_packed!(add, &mut a_dl, &mut b_dl, &mut c_dl);
  assert!(c.all_close(&e, 1e-8f32));
}