use super::{Count, FromMove, MovePlan, PlaceId, RangeId, SymId};
use crate::storage::Kind;
use crate::{codec_enum, codec_struct};
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum SortPlan {
File(FileSort),
Table(TableSort),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FileSort<R = PlaceId, Q = RangeId, K = SortKeys, F = u16> {
pub sd: u16,
pub merge: bool,
pub keys: K,
pub input: Option<SortIo<Q, F>>,
pub output: Option<SortIo<Q, F>>,
pub sort_return: R,
pub sort_control: R,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum SortIo<Q = RangeId, F = u16> {
Files(Vec<F>),
Procedure(Q),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SortKeys {
pub keys: Vec<SortKey>,
pub collating: Option<Box<[u8; 256]>>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct SortKey {
pub ascending: bool,
pub offset: u32,
pub len: u32,
pub kind: Kind,
pub item: u32,
pub collated: bool,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct TableSort {
pub first: PlaceId,
pub count: Count,
pub stride: u32,
pub keys: SortKeys,
pub name: SymId,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ReleasePlan {
pub record: PlaceId,
pub file: Option<u16>,
pub from: Option<FromMove>,
pub sort_return: PlaceId,
pub name: SymId,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ReturnPlan {
pub file: Option<u16>,
pub into: Option<(PlaceId, MovePlan)>,
pub sort_return: PlaceId,
pub name: SymId,
}
codec_enum!(SortPlan { File(sort) = 0, Table(sort) = 1 });
codec_struct!(FileSort { sd, merge, keys, input, output, sort_return, sort_control });
codec_enum!(SortIo { Files(files) = 0, Procedure(range) = 1 });
codec_struct!(SortKeys { keys, collating });
codec_struct!(SortKey { ascending, offset, len, kind, item, collated });
codec_struct!(TableSort { first, count, stride, keys, name });
codec_struct!(ReleasePlan { record, file, from, sort_return, name });
codec_struct!(ReturnPlan { file, into, sort_return, name });