From eb4531c221805b316ada03b8afba4d306e2d9cec Mon Sep 17 00:00:00 2001 From: Brian Grenier Date: Thu, 6 Feb 2025 14:42:59 -0700 Subject: [PATCH 1/2] Consistently use `Indexer` in LinkedList` Signed-off-by: Brian Grenier --- stdlib/src/collections/linked_list.mojo | 30 +++++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/stdlib/src/collections/linked_list.mojo b/stdlib/src/collections/linked_list.mojo index ef34ce84b9..8bb6977194 100644 --- a/stdlib/src/collections/linked_list.mojo +++ b/stdlib/src/collections/linked_list.mojo @@ -420,12 +420,17 @@ struct LinkedList[ curr = curr[].next return new^ - fn insert(mut self, owned idx: Int, owned elem: ElementType) raises: + fn insert[ + I: Indexer + ](mut self, owned idx: I, owned elem: ElementType) raises: """ Insert an element `elem` into the list at index `idx`. Time Complexity: O(1) + Parameters: + I: The type of index to use. + Raises: When given an out of bounds index. @@ -433,7 +438,7 @@ struct LinkedList[ idx: The index to insert `elem` at. `-len(self) <= idx <= len(self)`. elem: The item to insert into the list. """ - var i = max(0, index(idx) if idx >= 0 else index(idx) + len(self)) + var i = max(0, index(idx) if Int(idx) >= 0 else index(idx) + len(self)) if i == 0: var node = Self._NodePointer.alloc(1) @@ -478,7 +483,7 @@ struct LinkedList[ self._head = node self._size += 1 else: - raise String("Index {} out of bounds").format(idx) + raise String("Index {} out of bounds").format(i) fn extend(mut self, owned other: Self): """ @@ -610,7 +615,9 @@ struct LinkedList[ """ return not (self == other) - fn _get_node_ptr(ref self, index: Int) -> UnsafePointer[Node[ElementType]]: + fn _get_node_ptr[ + I: Indexer + ](ref self, index: I) -> UnsafePointer[Node[ElementType]]: """ Get a pointer to the node at the specified index. @@ -619,6 +626,9 @@ struct LinkedList[ Time Complexity: O(n) in len(self) + Parameters: + I: The type of index to use. + Args: index: The index of the node to get. @@ -626,7 +636,7 @@ struct LinkedList[ A pointer to the node at the specified index. """ var l = len(self) - var i = normalize_index[container_name="LinkedList"](index, self) + var i = normalize_index[container_name="LinkedList"](Int(index), self) debug_assert(0 <= i < l, "index out of bounds") var mid = l // 2 if i <= mid: @@ -640,12 +650,15 @@ struct LinkedList[ curr = curr[].prev return curr - fn __getitem__(ref self, index: Int) -> ref [self] ElementType: + fn __getitem__[I: Indexer](ref self, index: I) -> ref [self] ElementType: """ Get the element at the specified index. Time Complexity: O(n) in len(self) + Parameters: + I: The type of index to use. + Args: index: The index of the element to get. @@ -655,12 +668,15 @@ struct LinkedList[ debug_assert(len(self) > 0, "unable to get item from empty list") return self._get_node_ptr(index)[].value - fn __setitem__(mut self, index: Int, owned value: ElementType): + fn __setitem__[I: Indexer](mut self, index: I, owned value: ElementType): """ Set the element at the specified index. Time Complexity: O(n) in len(self) + Parameters: + I: The type of index to use. + Args: index: The index of the element to set. value: The new value to set. From bdf8e800500bbb6ec783680926303871690e9154 Mon Sep 17 00:00:00 2001 From: bgreni <42788181+bgreni@users.noreply.github.com> Date: Mon, 10 Feb 2025 20:32:35 -0700 Subject: [PATCH 2/2] Remove owned annotation from idx arg in `insert` Co-authored-by: soraros Signed-off-by: bgreni <42788181+bgreni@users.noreply.github.com> --- stdlib/src/collections/linked_list.mojo | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/stdlib/src/collections/linked_list.mojo b/stdlib/src/collections/linked_list.mojo index 8bb6977194..ce4ac74d1e 100644 --- a/stdlib/src/collections/linked_list.mojo +++ b/stdlib/src/collections/linked_list.mojo @@ -420,9 +420,7 @@ struct LinkedList[ curr = curr[].next return new^ - fn insert[ - I: Indexer - ](mut self, owned idx: I, owned elem: ElementType) raises: + fn insert[I: Indexer](mut self, idx: I, owned elem: ElementType) raises: """ Insert an element `elem` into the list at index `idx`.