Crate bisetmap [] [src]

A fast thread-safe two-way hash map of sets.

A BisetMap<L, R> is a Multi-Hash-Map between values of type L, called left values, and values of type R, called right values. This means every left value is associated with one or more right values and vice versa. Compare this to a HashMap, where every key is associated with exactly one value.

The structure is interior mutable and all operations are thread safe. Each clone provides access to the same underlying data.

Internally, a BisetMap is composed of two HashMaps, one for the left-to-right direction and one for right-to-left. As such, the big-O performance of the get, remove, insert, and contains methods are the same as those of a HashMap.

As with HashMap, it is considered a logic error to modify a value's hash while it is in the BisetMap using a Cell, RefCell, etc.

Examples

use bisetmap::BisetMap;

let subscriptions = BisetMap::new();

// insert client-ids and subscription topics
subscriptions.insert("Bob", "Tech");
subscriptions.insert("Bob", "Math");
subscriptions.insert("Alice", "Tech");
subscriptions.insert("Alice", "Romance");

// retrieve topic by client-id (left to right)
assert_eq!(subscriptions.get(&"Bob"), ["Math", "Tech"]);
assert_eq!(subscriptions.get(&"Alice"), ["Romance", "Tech"]);

// retrieve clients by topic (right to left)
assert_eq!(subscriptions.rev_get(&"Tech"), ["Alice", "Bob"]);
assert_eq!(subscriptions.rev_get(&"Math"), ["Bob"]);

// check membership
assert!(subscriptions.contains(&"Bob", &"Math"));
assert!(!subscriptions.contains(&"Bob", &"Romance"));

// check key/value existence
assert!(subscriptions.key_exists(&"Alice"));
assert!(subscriptions.value_exists(&"Tech"));

Insertion and Uniqueness

Consider the following example:

use bisetmap::BisetMap;

let bmap = BisetMap::new();
bmap.insert('a', 1);
bmap.insert('a', 1); // what to do here?

Duplicate key-value pairs are ignored and inserted only once

Structs

BisetMap

A two-way map between keys (left) and values (right).