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 ith 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
}
}