diff options
Diffstat (limited to 'third_party/rust/parity-wasm/src/builder/table.rs')
-rw-r--r-- | third_party/rust/parity-wasm/src/builder/table.rs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/third_party/rust/parity-wasm/src/builder/table.rs b/third_party/rust/parity-wasm/src/builder/table.rs new file mode 100644 index 0000000000..29bbe2d2dc --- /dev/null +++ b/third_party/rust/parity-wasm/src/builder/table.rs @@ -0,0 +1,85 @@ +use alloc::vec::Vec; +use crate::elements; +use super::invoke::{Invoke, Identity}; + +/// Table definition +#[derive(Debug, PartialEq)] +pub struct TableDefinition { + /// Minimum length + pub min: u32, + /// Maximum length, if any + pub max: Option<u32>, + /// Element segments, if any + pub elements: Vec<TableEntryDefinition>, +} + +/// Table elements entry definition +#[derive(Debug, PartialEq)] +pub struct TableEntryDefinition { + /// Offset initialization expression + pub offset: elements::InitExpr, + /// Values of initialization + pub values: Vec<u32>, +} + +/// Table builder +pub struct TableBuilder<F=Identity> { + callback: F, + table: TableDefinition, +} + +impl TableBuilder { + /// New table builder + pub fn new() -> Self { + TableBuilder::with_callback(Identity) + } +} + +impl<F> TableBuilder<F> where F: Invoke<TableDefinition> { + /// New table builder with callback in chained context + pub fn with_callback(callback: F) -> Self { + TableBuilder { + callback: callback, + table: Default::default(), + } + } + + /// Set/override minimum length + pub fn with_min(mut self, min: u32) -> Self { + self.table.min = min; + self + } + + /// Set/override maximum length + pub fn with_max(mut self, max: Option<u32>) -> Self { + self.table.max = max; + self + } + + /// Generate initialization expression and element values on specified index + pub fn with_element(mut self, index: u32, values: Vec<u32>) -> Self { + self.table.elements.push(TableEntryDefinition { + offset: elements::InitExpr::new(vec![ + elements::Instruction::I32Const(index as i32), + elements::Instruction::End, + ]), + values: values, + }); + self + } + + /// Finalize current builder spawning resulting struct + pub fn build(self) -> F::Result { + self.callback.invoke(self.table) + } +} + +impl Default for TableDefinition { + fn default() -> Self { + TableDefinition { + min: 0, + max: None, + elements: Vec::new(), + } + } +} |