vector_ext - [mainnet]
use 0x1::vector;
Constants
The index into the vector is out of bounds
const EINDEX_OUT_OF_BOUNDS: u64 = 131072;
Functions
range_move
public fun range_move<T>(from: &mut vector<T>, removal_position: u64, length: u64, to: &mut vector<T>, insert_position: u64)
Implementation
public native fun range_move<T>(from: &mut vector<T>, removal_position: u64, length: u64, to: &mut vector<T>, insert_position: u64);
split_off
Splits the collection into two at the given index. Returns a newly allocated vector containing the elements in the range [at, len). After the call, the original vector will be left containing the elements [0, at) with its previous capacity unchanged.
public fun split_off<Element>(self: &mut vector<Element>, at: u64): vector<Element>
Implementation
public fun split_off<Element>(self: &mut vector<Element>, at: u64): vector<Element> { let len = vector::length(self); assert!(at <= len, EINDEX_OUT_OF_BOUNDS);
let other = vector::empty(); range_move(self, at, len - at, &mut other, 0);
// let other = empty(); // while (len > at) { // push_back(&mut other, pop_back(self)); // len = len - 1; // }; // reverse(&mut other); other}
append
Pushes all of the elements of the other
vector into the self
vector.
public fun append<Element>(self: &mut vector<Element>, other: vector<Element>)
Implementation
public fun append<Element>(self: &mut vector<Element>, other: vector<Element>) { let self_length = self.length(); let other_length = other.length(); range_move(&mut other, 0, other_length, self, self_length); other.destroy_empty(); // reverse(&mut other); // reverse_append(self, other);}
insert
public fun insert<Element>(self: &mut vector<Element>, i: u64, e: Element)
Implementation
public fun insert<Element>(self: &mut vector<Element>, i: u64, e: Element) { let len = self.length(); assert!(i <= len, EINDEX_OUT_OF_BOUNDS);
if (i == len) { self.push_back(e); } else { let other = vector::singleton(e); range_move(&mut other, 0, 1, self, i); other.destroy_empty(); }}
remove
Remove the i
th element of the vector self
, shifting all subsequent elements.
This is O(n) and preserves ordering of elements in the vector.
Aborts if i
is out of bounds.
public fun remove<Element>(self: &mut vector<Element>, i: u64): Element
Implementation
public fun remove<Element>(self: &mut vector<Element>, i: u64): Element { let len = self.length(); // i out of bounds; abort if (i >= len) abort EINDEX_OUT_OF_BOUNDS;
if (i + 1 == len) { self.pop_back() } else { let other = vector::empty(); range_move(self, i, 1, &mut other, 0); let result = other.pop_back(); other.destroy_empty(); result }}