From d03b3ed597beb68f33d62ac6e33ca6ff8d27e032 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Mon, 27 Nov 2023 14:36:56 -0500 Subject: [PATCH 1/2] evm/kernel: add fct to remove the first element --- etherlink/kernel_evm/kernel/src/linked_list.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/etherlink/kernel_evm/kernel/src/linked_list.rs b/etherlink/kernel_evm/kernel/src/linked_list.rs index ffe1a6f69fb9..2efe57fab978 100644 --- a/etherlink/kernel_evm/kernel/src/linked_list.rs +++ b/etherlink/kernel_evm/kernel/src/linked_list.rs @@ -397,6 +397,13 @@ where let Some(LinkedListPointer { front, .. }) = &self.pointers else {return Ok(None)}; Ok(Some(front.get_data(host, &self.path)?)) } + + /// Removes the first element of the list and returns it + pub fn pop_first(&mut self, host: &mut impl Runtime) -> Result> { + let Some(LinkedListPointer { front, .. }) = &self.pointers else {return Ok(None)}; + let to_remove = front.id.clone(); + self.remove(host, &to_remove) + } } #[cfg(test)] -- GitLab From b003da75c9f016af6b4b0404dbe72b15d0f15069 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Mon, 27 Nov 2023 15:23:17 -0500 Subject: [PATCH 2/2] evm/kernel: test pop_first --- .../kernel_evm/kernel/src/linked_list.rs | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/etherlink/kernel_evm/kernel/src/linked_list.rs b/etherlink/kernel_evm/kernel/src/linked_list.rs index 2efe57fab978..abaa9307f109 100644 --- a/etherlink/kernel_evm/kernel/src/linked_list.rs +++ b/etherlink/kernel_evm/kernel/src/linked_list.rs @@ -680,5 +680,40 @@ mod tests { assert_eq!(elt, &read); } } + + #[test] + fn test_pop_first_after_push(elements: HashMap<[u8; TRANSACTION_HASH_SIZE], u8>) { + let mut host = MockHost::default(); + let path = RefPath::assert_from(b"/list"); + let mut list = LinkedList::new(&path, &host).expect("list should be created"); + + for (id, elt) in elements { + list.push(&mut host, &Hash(id), &elt).expect("storage should work"); + let removed = list.pop_first(&mut host).expect("storage should work").expect("element should be present"); + assert_eq!(elt, removed); + } + } + + #[test] + fn test_pop_first_keep_the_order(elements: HashMap<[u8; TRANSACTION_HASH_SIZE], u8>) { + let mut host = MockHost::default(); + let path = RefPath::assert_from(b"/list"); + let mut list = LinkedList::new(&path, &host).expect("list should be created"); + + let mut inserted = vec![]; + let mut removed = vec![]; + + for (id, elt) in elements { + list.push(&mut host, &Hash(id), &elt).expect("storage should work"); + inserted.push(elt); + } + + while !list.is_empty() { + let pop = list.pop_first(&mut host).expect("storage should work").expect("element should be present"); + removed.push(pop); + } + + assert_eq!(inserted, removed); + } } } -- GitLab