//! This crate contains the refactored basic components required
//! for `runtime` and `frontend` TVM crates.

#![crate_name = "tvm_common"]
#![recursion_limit = "1024"]
#![allow(non_camel_case_types, unused_imports)]
#![feature(box_syntax, try_from)]

#[macro_use]
extern crate error_chain;

/// Unified ffi module for both runtime and frontend crates.
pub mod ffi {
    #![allow(non_camel_case_types, non_snake_case, non_upper_case_globals, unused)]

    #[cfg(feature = "frontend")]
    pub extern crate tvm_sys as ts;

    #[cfg(feature = "runtime")]
    pub mod runtime {
        use std::os::raw::{c_char, c_int, c_void};

        include!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/c_runtime_api.rs"));

        pub type BackendPackedCFunc = extern "C" fn(
            args: *const TVMValue,
            type_codes: *const c_int,
            num_args: c_int,
        ) -> c_int;
    }
}

pub mod errors;
pub mod ty;
pub mod value;

pub use errors::*;
pub use ty::TVMTypeCode;
pub use value::{TVMArgValue, TVMRetValue, TVMValue};