pub struct TreeIndex<K, V> where
    K: 'static + Clone + Ord + Send + Sync,
    V: 'static + Clone + Send + Sync
{ /* private fields */ }
Expand description

Scalable concurrent B+ tree.

TreeIndex is a B+ tree variant that is optimized for read operations. Read operations, such as read, scan, are neither blocked nor interrupted by other threads. Write operations, such as insert, remove, do not block if they do not entail structural changes to the tree. In case an operation is conflicted with another, one of them yields the task executor.

The key features of TreeIndex

  • Write-free read: read operations never modify the shared data.
  • Near lock-free write: write operations do not block unless a structural change is needed.

The key statistics for TreeIndex

  • The maximum number of key-value pairs that a leaf can store: 14.
  • The maximum number of leaves or child nodes that a node can point to: 15.
  • The size of metadata per key-value pair in a leaf: ~3-byte.

Implementations

Creates an empty TreeIndex.

Examples
use scc::awaitable::TreeIndex;

let treeindex: TreeIndex<u64, u32> = TreeIndex::new();

Inserts a key-value pair.

Errors

Returns an error along with the supplied key-value pair if the key exists.

Examples
use scc::awaitable::TreeIndex;

let treeindex: TreeIndex<u64, u32> = TreeIndex::new();
let future_insert = treeindex.insert(1, 10);

Removes a key-value pair.

Examples
use scc::awaitable::TreeIndex;

let treeindex: TreeIndex<u64, u32> = TreeIndex::new();
let future_remove = treeindex.remove(&1);

Removes a key-value pair if the given condition is met.

Examples
use scc::awaitable::TreeIndex;

let treeindex: TreeIndex<u64, u32> = TreeIndex::new();
let future_remove = treeindex.remove_if(&1, |v| *v == 0);

Reads a key-value pair.

It returns None if the key does not exist.

Examples
use scc::awaitable::TreeIndex;

let treeindex: TreeIndex<u64, u32> = TreeIndex::new();
assert!(treeindex.read(&1, |k, v| *v).is_none());

Reads a key-value pair using the supplied Barrier.

It enables the caller to use the value reference outside the method. It returns None if the key does not exist.

Examples
use scc::awaitable::TreeIndex;
use scc::ebr::Barrier;

let treeindex: TreeIndex<u64, u32> = TreeIndex::new();

let barrier = Barrier::new();
assert!(treeindex.read_with(&1, |k, v| v, &barrier).is_none());

Clears the TreeIndex.

Examples
use scc::awaitable::TreeIndex;

let treeindex: TreeIndex<u64, u32> = TreeIndex::new();

treeindex.clear();
assert_eq!(treeindex.len(), 0);

Returns the size of the TreeIndex.

It internally scans all the leaf nodes, and therefore the time complexity is O(N).

Examples
use scc::awaitable::TreeIndex;

let treeindex: TreeIndex<u64, u32> = TreeIndex::new();
assert_eq!(treeindex.len(), 0);

Returns true if the TreeIndex is empty.

It internally scans all the leaf nodes, and therefore the time complexity is O(N).

Examples
use scc::awaitable::TreeIndex;

let treeindex: TreeIndex<u64, u32> = TreeIndex::new();

assert!(treeindex.is_empty());

Returns the depth of the TreeIndex.

Examples
use scc::awaitable::TreeIndex;

let treeindex: TreeIndex<u64, u32> = TreeIndex::new();
assert_eq!(treeindex.depth(), 0);

Returns a Visitor.

The returned Visitor starts scanning from the minimum key-value pair.

Examples
use scc::awaitable::TreeIndex;
use scc::ebr::Barrier;

let treeindex: TreeIndex<u64, u32> = TreeIndex::new();

let barrier = Barrier::new();
let mut visitor = treeindex.iter(&barrier);
assert!(visitor.next().is_none());

Returns a Range that scans keys in the given range.

Examples
use scc::awaitable::TreeIndex;
use scc::ebr::Barrier;

let treeindex: TreeIndex<u64, u32> = TreeIndex::new();

let barrier = Barrier::new();
assert_eq!(treeindex.range(4..=8, &barrier).count(), 0);

Trait Implementations

Creates a TreeIndex with the default parameters.

Examples
use scc::awaitable::TreeIndex;

let treeindex: TreeIndex<u64, u32> = TreeIndex::default();

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.