Skip to main content

Module 0x2::table_vec

A basic scalable vector library implemented using Table.

use 0x2::table;
use 0x2::tx_context;

Struct TableVec

struct TableVec<Element: store> has store
Fields
contents: table::Table<u64, Element>
The contents of the table vector.

Constants

const EIndexOutOfBound: u64 = 0;

const ETableNonEmpty: u64 = 1;

Function empty

Create an empty TableVec.

public fun empty<Element: store>(ctx: &mut tx_context::TxContext): table_vec::TableVec<Element>
Implementation
public fun empty<Element: store>(ctx: &mut TxContext): TableVec<Element> {
    TableVec {
        contents: table::new(ctx)
    }
}

Function singleton

Return a TableVec of size one containing element e.

public fun singleton<Element: store>(e: Element, ctx: &mut tx_context::TxContext): table_vec::TableVec<Element>
Implementation
public fun singleton<Element: store>(e: Element, ctx: &mut TxContext): TableVec<Element> {
    let mut t = empty(ctx);
    t.push_back(e);
    t
}

Function length

Return the length of the TableVec.

public fun length<Element: store>(t: &table_vec::TableVec<Element>): u64
Implementation
public fun length<Element: store>(t: &TableVec<Element>): u64 {
    t.contents.length()
}

Function is_empty

Return if the TableVec is empty or not.

public fun is_empty<Element: store>(t: &table_vec::TableVec<Element>): bool
Implementation
public fun is_empty<Element: store>(t: &TableVec<Element>): bool {
    t.length() == 0
}

Function borrow

Acquire an immutable reference to the ith element of the TableVec t. Aborts if i is out of bounds.

public fun borrow<Element: store>(t: &table_vec::TableVec<Element>, i: u64): &Element
Implementation
public fun borrow<Element: store>(t: &TableVec<Element>, i: u64): &Element {
    assert!(t.length() > i, EIndexOutOfBound);
    &t.contents[i]
}

Function push_back

Add element e to the end of the TableVec t.

public fun push_back<Element: store>(t: &mut table_vec::TableVec<Element>, e: Element)
Implementation
public fun push_back<Element: store>(t: &mut TableVec<Element>, e: Element) {
    let key = t.length();
    t.contents.add(key, e);
}

Function borrow_mut

Return a mutable reference to the ith element in the TableVec t. Aborts if i is out of bounds.

public fun borrow_mut<Element: store>(t: &mut table_vec::TableVec<Element>, i: u64): &mut Element
Implementation
public fun borrow_mut<Element: store>(t: &mut TableVec<Element>, i: u64): &mut Element {
    assert!(t.length() > i, EIndexOutOfBound);
    &mut t.contents[i]
}

Function pop_back

Pop an element from the end of TableVec t. Aborts if t is empty.

public fun pop_back<Element: store>(t: &mut table_vec::TableVec<Element>): Element
Implementation
public fun pop_back<Element: store>(t: &mut TableVec<Element>): Element {
    let length = length(t);
    assert!(length > 0, EIndexOutOfBound);
    t.contents.remove(length - 1)
}

Function destroy_empty

Destroy the TableVec t. Aborts if t is not empty.

public fun destroy_empty<Element: store>(t: table_vec::TableVec<Element>)
Implementation
public fun destroy_empty<Element: store>(t: TableVec<Element>) {
    assert!(length(&t) == 0, ETableNonEmpty);
    let TableVec { contents } = t;
    contents.destroy_empty();
}

Function drop

Drop a possibly non-empty TableVec t. Usable only if the value type Element has the drop ability

public fun drop<Element: drop, store>(t: table_vec::TableVec<Element>)
Implementation
public fun drop<Element: drop + store>(t: TableVec<Element>) {
    let TableVec { contents } = t;
    contents.drop()
}

Function swap

Swaps the elements at the ith and jth indices in the TableVec t. Aborts if i or j is out of bounds.

public fun swap<Element: store>(t: &mut table_vec::TableVec<Element>, i: u64, j: u64)
Implementation
public fun swap<Element: store>(t: &mut TableVec<Element>, i: u64, j: u64) {
    assert!(t.length() > i, EIndexOutOfBound);
    assert!(t.length() > j, EIndexOutOfBound);
    if (i == j) { return };
    let element_i = t.contents.remove(i);
    let element_j = t.contents.remove(j);
    t.contents.add(j, element_i);
    t.contents.add(i, element_j);
}

Function swap_remove

Swap the ith element of the TableVec t with the last element and then pop the TableVec. This is O(1), but does not preserve ordering of elements in the TableVec. Aborts if i is out of bounds.

public fun swap_remove<Element: store>(t: &mut table_vec::TableVec<Element>, i: u64): Element
Implementation
public fun swap_remove<Element: store>(t: &mut TableVec<Element>, i: u64): Element {
    assert!(t.length() > i, EIndexOutOfBound);
    let last_idx = t.length() - 1;
    t.swap(i, last_idx);
    t.pop_back()
}