use crate::value::{Value, AV};
use std::fmt::{self, Debug};
mod error;
pub use error::*;
#[cfg(target_arch = "x86_64")]
mod x86_64;
#[cfg(target_arch = "x86_64")]
pub use x86_64::*;
#[derive(PartialEq, Clone, Debug, Copy)]
pub(crate) enum Direction {
In,
Out,
InOut,
}
pub(crate) struct Definition<'a> {
pub call_nr: usize,
pub call_name: String,
pub ident: Ident,
#[allow(dead_code)]
pub var_names: Vec<&'a str>,
pub var_types: Vec<AV>,
pub out_value: AV,
}
impl<'a> Definition<'a> {
pub fn new(ident: Ident, var_names: Vec<&'a str>, var_types: Vec<AV>, out_value: AV) -> Self {
let call_nr = ident.clone() as usize;
let call_name = ident.to_string().to_lowercase();
Definition {
call_nr,
call_name,
ident,
var_names,
var_types,
out_value,
}
}
}
impl<'a> fmt::Debug for Definition<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Definition({:?}, nr={})", self.call_name, self.call_nr)
}
}
pub(crate) struct Definitions<'a> {
definitions: Vec<Definition<'a>>,
}
impl<'a> Definitions<'a> {
pub fn new() -> Self {
Self {
definitions: Vec::new(),
}
}
pub fn add(&mut self, name: Ident, inp_f: Vec<&'a str>, inp: Vec<AV>, out: AV) {
self.push(Definition::new(name, inp_f, inp, out))
}
pub fn push(&mut self, definition: Definition<'a>) {
self.definitions.push(definition);
}
pub fn into_definitions(self) -> Vec<Definition<'a>> {
self.definitions
}
}
pub trait VarType: Send + Sync {
fn convert(&self, input: u64) -> Value;
}
pub trait VarOutType: Send + Sync + Debug {}