diff --git a/src/instructions/mod.rs b/src/instructions/mod.rs index 1bef434..e2356be 100644 --- a/src/instructions/mod.rs +++ b/src/instructions/mod.rs @@ -200,3 +200,4 @@ pub mod common; pub mod logical; pub mod numeric; pub mod utils; +pub mod vector; diff --git a/src/instructions/vector.rs b/src/instructions/vector.rs new file mode 100644 index 0000000..c39e430 --- /dev/null +++ b/src/instructions/vector.rs @@ -0,0 +1,36 @@ +use rust_decimal::Decimal; +use crate::push::state::PushState; + +pub fn _concat(vals: Vec>) -> Option> +where + T: Clone, +{ + let mut concat_vec = vals[0].clone(); + concat_vec.extend(vals[1].clone().into_iter()); + Some(concat_vec) +} +make_instruction_clone!(vector_int, vector_int, _concat, Vec, 2); +make_instruction_clone!(vector_float, vector_float, _concat, Vec, 2); +make_instruction_clone!(vector_string, vector_string, _concat, Vec>, 2); +make_instruction_clone!(vector_boolean, vector_boolean, _concat, Vec, 2); +make_instruction_clone!(vector_char, vector_char, _concat, Vec, 2); +make_instruction_clone!(string, string, _concat, Vec, 2); + +#[cfg(test)] +mod tests { + use super::*; + use crate::push::state::EMPTY_STATE; + + #[test] + fn test_vector_concat() { + let mut test_state = EMPTY_STATE; + + test_state.vector_int = vec![vec![4, 5, 6], vec![1, 2, 3]]; + vector_int_concat(&mut test_state); + assert_eq!(vec![vec![1, 2, 3, 4, 5, 6]], test_state.vector_int); + + test_state.string = vec![vec!['s', 't'], vec!['t', 'e']]; + string_concat(&mut test_state); + assert_eq!(vec![vec!['t', 'e', 's', 't']], test_state.string); + } +}