Skip to main content

Module iota::linked_table

Similar to iota::table but the values are linked together, allowing for ordered insertion and removal

use iota::address; use iota::dynamic_field; use iota::hex; use iota::object; use iota::tx_context; use std::ascii; use std::bcs; use std::option; use std::string; use std::vector;

Module Functions

pub new

Creates a new, empty table

public fun new<K: copy, drop, store, V: store>(ctx: &mut iota::tx_context::TxContext): iota::linked_table::LinkedTable<K, V>

Implementation

public fun new<K: copy + drop + store, V: store>(ctx: &mut TxContext): LinkedTable<K, V> {     LinkedTable {         id: object::new(ctx),         size: 0,         head: option::none(),         tail: option::none(),     } }

Structs

struct LinkedTable

public struct LinkedTable<K: copy, drop, store, phantom V: store> has key, store

Fields
id: iota::object::UID

the ID of this table

size: u64

the number of key-value pairs in the table

head: std::option::Option<K>

the front of the table, i.e. the key of the first entry

tail: std::option::Option<K>

the back of the table, i.e. the key of the last entry

pub back

Returns the key for the last element in the table, or None if the table is empty

public fun back<K: copy, drop, store, V: store>(table: &iota::linked_table::LinkedTable<K, V>): &std::option::Option<K>

Implementation

public fun back<K: copy + drop + store, V: store>(table: &LinkedTable<K, V>): &Option {     &table.tail }

pub borrow

Immutable borrows the value associated with the key in the table table: &LinkedTable<K, V>. Aborts with iota::dynamic_field::EFieldDoesNotExist if the table does not have an entry with that key k: K.

public fun borrow<K: copy, drop, store, V: store>(table: &iota::linked_table::LinkedTable<K, V>, k: K): &V

Implementation

public fun borrow<K: copy + drop + store, V: store>(table: &LinkedTable<K, V>, k: K): &V {     &field::borrow<K, Node<K, V>>(&table.id, k).value }

pub borrow_mut

Mutably borrows the value associated with the key in the table table: &mut LinkedTable<K, V>. Aborts with iota::dynamic_field::EFieldDoesNotExist if the table does not have an entry with that key k: K.

public fun borrow_mut<K: copy, drop, store, V: store>(table: &mut iota::linked_table::LinkedTable<K, V>, k: K): &mut V

Implementation

public fun borrow_mut<K: copy + drop + store, V: store>(     table: &mut LinkedTable<K, V>,     k: K, ): &mut V {     &mut field::borrow_mut<K, Node<K, V>>(&mut table.id, k).value }

pub contains

Returns true iff there is a value associated with the key k: K in table table: &LinkedTable<K, V>

public fun contains<K: copy, drop, store, V: store>(table: &iota::linked_table::LinkedTable<K, V>, k: K): bool

Implementation

public fun contains<K: copy + drop + store, V: store>(table: &LinkedTable<K, V>, k: K): bool {     field::exists_with_type<K, Node<K, V>>(&table.id, k) }

pub destroy_empty

Destroys an empty table Aborts with ETableNotEmpty if the table still contains values

public fun destroy_empty<K: copy, drop, store, V: store>(table: iota::linked_table::LinkedTable<K, V>)

Implementation

public fun destroy_empty<K: copy + drop + store, V: store>(table: LinkedTable<K, V>) {     let LinkedTable { id, size, head: _, tail: _ } = table;     assert!(size == 0, ETableNotEmpty);     id.delete() }

pub drop

Drop a possibly non-empty table. Usable only if the value type V has the drop ability

public fun drop<K: copy, drop, store, V: drop, store>(table: iota::linked_table::LinkedTable<K, V>)

Implementation

public fun drop<K: copy + drop + store, V: drop + store>(table: LinkedTable<K, V>) {     let LinkedTable { id, size: _, head: _, tail: _ } = table;     id.delete() }

pub front

Returns the key for the first element in the table, or None if the table is empty

public fun front<K: copy, drop, store, V: store>(table: &iota::linked_table::LinkedTable<K, V>): &std::option::Option<K>

Implementation

public fun front<K: copy + drop + store, V: store>(table: &LinkedTable<K, V>): &Option {     &table.head }

pub is_empty

Returns true iff the table is empty (if length returns 0)

public fun is_empty<K: copy, drop, store, V: store>(table: &iota::linked_table::LinkedTable<K, V>): bool

Implementation

public fun is_empty<K: copy + drop + store, V: store>(table: &LinkedTable<K, V>): bool {     table.size == 0 }

pub length

Returns the size of the table, the number of key-value pairs

public fun length<K: copy, drop, store, V: store>(table: &iota::linked_table::LinkedTable<K, V>): u64

Implementation

public fun length<K: copy + drop + store, V: store>(table: &LinkedTable<K, V>): u64 {     table.size }

pub next

Borrows the key for the next entry of the specified key k: K in the table table: &LinkedTable<K, V>. Returns None if the entry does not have a predecessor. Aborts with iota::dynamic_field::EFieldDoesNotExist if the table does not have an entry with that key k: K

public fun next<K: copy, drop, store, V: store>(table: &iota::linked_table::LinkedTable<K, V>, k: K): &std::option::Option<K>

Implementation

public fun next<K: copy + drop + store, V: store>(table: &LinkedTable<K, V>, k: K): &Option {     &field::borrow<K, Node<K, V>>(&table.id, k).next }

pub pop_back

Removes the back of the table table: &mut LinkedTable<K, V> and returns the value. Aborts with ETableIsEmpty if the table is empty

public fun pop_back<K: copy, drop, store, V: store>(table: &mut iota::linked_table::LinkedTable<K, V>): (K, V)

Implementation

public fun pop_back<K: copy + drop + store, V: store>(table: &mut LinkedTable<K, V>): (K, V) {     assert!(table.tail.is_some(), ETableIsEmpty);     let tail = *table.tail.borrow();     (tail, table.remove(tail)) }

pub pop_front

Removes the front of the table table: &mut LinkedTable<K, V> and returns the value. Aborts with ETableIsEmpty if the table is empty

public fun pop_front<K: copy, drop, store, V: store>(table: &mut iota::linked_table::LinkedTable<K, V>): (K, V)

Implementation

public fun pop_front<K: copy + drop + store, V: store>(table: &mut LinkedTable<K, V>): (K, V) {     assert!(table.head.is_some(), ETableIsEmpty);     let head = *table.head.borrow();     (head, table.remove(head)) }

pub prev

Borrows the key for the previous entry of the specified key k: K in the table table: &LinkedTable<K, V>. Returns None if the entry does not have a predecessor. Aborts with iota::dynamic_field::EFieldDoesNotExist if the table does not have an entry with that key k: K

public fun prev<K: copy, drop, store, V: store>(table: &iota::linked_table::LinkedTable<K, V>, k: K): &std::option::Option<K>

Implementation

public fun prev<K: copy + drop + store, V: store>(table: &LinkedTable<K, V>, k: K): &Option {     &field::borrow<K, Node<K, V>>(&table.id, k).prev }

pub push_back

Inserts a key-value pair at the back of the table, i.e. the newly inserted pair will be the last element in the table Aborts with iota::dynamic_field::EFieldAlreadyExists if the table already has an entry with that key k: K.

public fun push_back<K: copy, drop, store, V: store>(table: &mut iota::linked_table::LinkedTable<K, V>, k: K, value: V)

Implementation

public fun push_back<K: copy + drop + store, V: store>(     table: &mut LinkedTable<K, V>,     k: K,     value: V, ) {     if (table.head.is_none()) table.head.fill(k);     let old_tail = table.tail.swap_or_fill(k);     let prev = if (old_tail.is_some()) {         let old_tail_k = old_tail.destroy_some();         field::borrow_mut<K, Node<K, V>>(&mut table.id, old_tail_k).next = option::some(k);         option::some(old_tail_k)     } else {         option::none()     };     let next = option::none();     field::add(&mut table.id, k, Node { prev, next, value });     table.size = table.size + 1; }

pub push_front

Inserts a key-value pair at the front of the table, i.e. the newly inserted pair will be the first element in the table Aborts with iota::dynamic_field::EFieldAlreadyExists if the table already has an entry with that key k: K.

public fun push_front<K: copy, drop, store, V: store>(table: &mut iota::linked_table::LinkedTable<K, V>, k: K, value: V)

Implementation

public fun push_front<K: copy + drop + store, V: store>(     table: &mut LinkedTable<K, V>,     k: K,     value: V, ) {     let old_head = table.head.swap_or_fill(k);     if (table.tail.is_none()) table.tail.fill(k);     let prev = option::none();     let next = if (old_head.is_some()) {         let old_head_k = old_head.destroy_some();         field::borrow_mut<K, Node<K, V>>(&mut table.id, old_head_k).prev = option::some(k);         option::some(old_head_k)     } else {         option::none()     };     field::add(&mut table.id, k, Node { prev, next, value });     table.size = table.size + 1; }

pub remove

Removes the key-value pair in the table table: &mut LinkedTable<K, V> and returns the value. This splices the element out of the ordering. Aborts with iota::dynamic_field::EFieldDoesNotExist if the table does not have an entry with that key k: K. Note: this is also what happens when the table is empty.

public fun remove<K: copy, drop, store, V: store>(table: &mut iota::linked_table::LinkedTable<K, V>, k: K): V

Implementation

public fun remove<K: copy + drop + store, V: store>(table: &mut LinkedTable<K, V>, k: K): V {     let Node<K, V> { prev, next, value } = field::remove(&mut table.id, k);     table.size = table.size - 1;     if (prev.is_some()) {         field::borrow_mut<K, Node<K, V>>(&mut table.id, *prev.borrow()).next = next     };     if (next.is_some()) {         field::borrow_mut<K, Node<K, V>>(&mut table.id, *next.borrow()).prev = prev     };     if (table.head.borrow() == &k) table.head = next;     if (table.tail.borrow() == &k) table.tail = prev;     value }

struct Node

public struct Node<K: copy, drop, store, V: store> has store

Fields
prev: std::option::Option<K>

the previous key

next: std::option::Option<K>

the next key

value: V

the value being stored

Constants

err ETableNotEmpty

const ETableNotEmpty: u64 = 0;

err ETableIsEmpty

const ETableIsEmpty: u64 = 1;