From ab702bc1191b3cfe07749053604a77e142da3aae Mon Sep 17 00:00:00 2001 From: bitzoic Date: Wed, 29 Jan 2025 14:21:07 +0100 Subject: [PATCH] Add last() to Vec --- sway-lib-std/src/vec.sw | 26 +++++++++++++++++++ .../vec_inline_tests/src/main.sw | 18 +++++++++++++ 2 files changed, 44 insertions(+) diff --git a/sway-lib-std/src/vec.sw b/sway-lib-std/src/vec.sw index eb8036aaded..9956f6be182 100644 --- a/sway-lib-std/src/vec.sw +++ b/sway-lib-std/src/vec.sw @@ -753,6 +753,32 @@ impl Vec { self.len = new_len; } + + /// Returns the last element in the `Vec`. + /// + /// # Returns + /// + /// [Option] - The last element in the `Vec` or `None`. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let mut vec = Vec::new(); + /// assert(vec.last() == None); + /// vec.push(1u64); + /// assert(vec.last() == Some(1u64)); + /// vec.push(2u64); + /// assert(vec.last() == Some(2u64)); + /// } + /// ``` + pub fn last(self) -> Option { + if self.len == 0 { + return None; + } + + Some(self.buf.ptr().add::(self.len - 1).read::()) + } } impl AsRawSlice for Vec { diff --git a/test/src/in_language_tests/test_programs/vec_inline_tests/src/main.sw b/test/src/in_language_tests/test_programs/vec_inline_tests/src/main.sw index aeefef59f0f..e4fddd34386 100644 --- a/test/src/in_language_tests/test_programs/vec_inline_tests/src/main.sw +++ b/test/src/in_language_tests/test_programs/vec_inline_tests/src/main.sw @@ -805,3 +805,21 @@ fn vec_resize() { assert(vec_2.get(1) == Some(1)); assert(vec_2.get(2) == Some(1)); } + +#[test] +fn vec_last() { + let (mut vec_1, a, b, c) = setup(); + assert(vec_1.last() == Some(9)); + + vec_1.push(2); + assert(vec_1.last() == Some(2)); + + vec_1.push(3); + assert(vec_1.last() == Some(3)); + + let _ = vec_1.pop(); + assert(vec_1.last() == Some(2)); + + let vec_2: Vec = Vec::new(); + assert(vec_2.last() == None) +}