use crate::{
panic, Assigns, Block, Cell, ColInfo, DataType, EvalEnv, Expr, IndexInfo, ObjRef, PagePtr, Rc,
RefCell, Table, Value,
};
#[non_exhaustive]
pub enum Instruction {
PushConst(Value),
PushValue(CExpPtr<Value>),
PushLocal(usize),
PopToLocal(usize),
Jump(usize),
JumpIfFalse(usize, CExpPtr<bool>),
Call(Rc<Function>),
Return,
Throw,
Execute,
ForInit(usize, Box<CTableExpression>),
ForNext(usize, Box<ForNextInfo>),
ForSortInit(usize, Box<CFromExpression>),
ForSortNext(usize, Box<(usize, usize, Assigns)>),
DataOp(Box<DO>),
Select(Box<CFromExpression>),
Set(Box<CFromExpression>),
PushInt(CExpPtr<i64>),
PushFloat(CExpPtr<f64>),
PushBool(CExpPtr<bool>),
AssignLocal(usize, CExpPtr<Value>),
AppendLocal(usize, CExpPtr<Value>),
IncLocal(usize, CExpPtr<Value>),
DecLocal(usize, CExpPtr<Value>),
}
#[non_exhaustive]
pub struct Function {
pub param_count: usize,
pub return_type: DataType,
pub local_typ: Vec<DataType>,
pub source: Rc<String>,
pub ilist: RefCell<Vec<Instruction>>, pub compiled: Cell<bool>,
}
pub trait CExp<T> {
fn eval(&self, ee: &mut EvalEnv, data: &[u8]) -> T;
}
pub type CExpPtr<T> = Box<dyn CExp<T>>;
#[derive(Clone, Copy)]
#[non_exhaustive]
pub enum CompileFunc {
Value(fn(&Block, &mut [Expr]) -> CExpPtr<Value>),
Int(fn(&Block, &mut [Expr]) -> CExpPtr<i64>),
Float(fn(&Block, &mut [Expr]) -> CExpPtr<f64>),
}
pub type DataSource = Box<dyn Iterator<Item = (PagePtr, usize)>>;
#[non_exhaustive]
pub struct ForState {
pub data_source: DataSource,
}
impl std::fmt::Debug for ForState {
fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result {
Ok(())
}
}
#[non_exhaustive]
pub struct ForSortState {
pub ix: usize,
pub rows: Vec<Vec<Value>>,
}
impl std::fmt::Debug for ForSortState {
fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result {
Ok(())
}
}
#[non_exhaustive]
pub struct ForNextInfo {
pub for_id: usize,
pub assigns: Assigns,
pub exps: Vec<CExpPtr<Value>>,
pub wher: Option<CExpPtr<bool>>,
}
#[non_exhaustive]
pub enum CTableExpression {
Base(Rc<Table>),
IdGet(Rc<Table>, CExpPtr<i64>),
IxGet(Rc<Table>, Vec<CExpPtr<Value>>, usize),
Values(Vec<Vec<CExpPtr<Value>>>),
}
impl CTableExpression {
pub fn table(&self) -> Rc<Table> {
match self {
CTableExpression::Base(t) => t.clone(),
CTableExpression::IdGet(t, _) => t.clone(),
CTableExpression::IxGet(t, _, _) => t.clone(),
_ => panic!(),
}
}
}
#[non_exhaustive]
pub struct CFromExpression {
pub colnames: Vec<String>,
pub assigns: Assigns,
pub exps: Vec<CExpPtr<Value>>,
pub from: Option<CTableExpression>,
pub wher: Option<CExpPtr<bool>>,
pub orderby: Vec<CExpPtr<Value>>,
pub desc: Vec<bool>,
}
#[non_exhaustive]
pub enum DO {
CreateTable(ColInfo),
CreateIndex(IndexInfo),
CreateSchema(String),
CreateFunction(ObjRef, Rc<String>, bool),
AlterTable(ObjRef, Vec<AlterCol>),
DropSchema(String),
DropTable(ObjRef),
DropIndex(ObjRef, String),
DropFunction(ObjRef),
Insert(Rc<Table>, Vec<usize>, CTableExpression),
Update(
Vec<(usize, CExpPtr<Value>)>,
CTableExpression,
Option<CExpPtr<bool>>,
),
Delete(CTableExpression, Option<CExpPtr<bool>>),
}
#[non_exhaustive]
pub enum AlterCol {
Add(String, DataType),
Drop(String),
Modify(String, DataType),
}