enum-table
enum-table is a lightweight and efficient Rust library for mapping enums to values.
It provides a fast, type-safe, and allocation-free alternative to using HashMap
for enum keys,
with compile-time safety and logarithmic-time access.
See CHANGELOG for version history and recent updates.
Installation
Add this to your Cargo.toml
:
[]
= "1.0"
Requires Rust 1.85 or later.
Features at a Glance
- Type Safety: Only valid enum variants can be used as keys.
- Compile-Time Checks: Leverages Rust's type system for compile-time guarantees.
- Efficiency: O(log N) access time via binary search, no heap allocation.
- Custom Derive: Procedural macro to automatically implement the
Enumable
trait for enums. - Const Support: Tables can be constructed at compile time.
- Serde Support: Optional serialization and deserialization support with the
serde
feature.
Usage Examples
Basic Usage
use ;
// Automatically implements Enumable trait
// Optional: but recommended for specification of discriminants
// Compile-time table creation using the et! macro
static TABLE: COUNT }> =
et!;
// Accessing values from the compile-time table
const A: &str = TABLE.get;
assert_eq!;
// Runtime table creation
let mut table = COUNT }> new_with_fn;
assert_eq!;
// This call returns the old value as all enum variants are initialized
let old_b = table.set;
assert_eq!;
assert_eq!;
Serde Support
Enable serde support by adding the serde
feature:
[]
= { = "1.0", = ["serde"] }
= "1.0"
use ;
use ;
let table = COUNT }> new_with_fn;
// Serialize to JSON
let json = to_string.unwrap;
assert_eq!;
// Deserialize from JSON
let deserialized: COUNT }> =
from_str.unwrap;
assert_eq!;
Error Handling
The library provides methods for handling potential errors during table creation:
use ;
// Using try_new_with_fn for fallible initialization
let result = COUNT }> try_new_with_fn;
assert!;
let = result.unwrap_err;
assert_eq!;
assert_eq!;
API Overview
Key Methods
EnumTable::new_with_fn()
: Create a table by mapping each enum variant to a valueEnumTable::try_new_with_fn()
: Create a table with error handling supportEnumTable::checked_new_with_fn()
: Create a table with optional valuesEnumTable::get()
: Access the value for a specific enum variantEnumTable::get_mut()
: Get mutable access to a valueEnumTable::set()
: Update a value and return the old one
Additional Functionality
map()
: Transform all values in the tableiter()
,iter_mut()
: Iterate over key-value pairskeys()
,values()
: Iterate over keys or values separatelyinto_vec()
: Convert the table to a vector of key-value pairstry_from_vec()
: Create a table from a vector of key-value pairs
For complete API documentation, visit docs.rs/enum-table.
Performance
The enum-table
library is designed for performance:
- Access Time: O(log N) lookup time via binary search of enum discriminants
- Memory Efficiency: No heap allocations for the table structure
- Compile-Time Optimization: Static tables can be fully constructed at compile time
Comparison with Alternatives
- Compared to
HashMap<EnumType, V>
:enum-table
provides compile-time safety, no heap allocations, and potentially better cache locality. - Compared to
match
statements:enum-table
offers more flexibility and allows for runtime modification of values. - Compared to arrays with enum discriminants as indices:
enum-table
works with non-continuous and custom discriminants.
Feature Flags
- default: Enables the
derive
feature by default. - derive: Enables the
Enumable
derive macro for automatic trait implementation. - serde: Enables serialization and deserialization support using Serde.
License
Licensed under the MIT license
Benchmarks
Invoke the benchmarks using cargo bench
to compare the performance of EnumTable
with a HashMap
for enum keys.
The benchmarks measure the time taken for creating a table, getting values, and setting values.
EnumTable::new_with_fn time: [295.20 ps 302.47 ps 313.13 ps]
Found 4 outliers among 100 measurements (4.00%)
2 (2.00%) high mild
2 (2.00%) high severe
EnumTable::get time: [286.89 ps 287.14 ps 287.50 ps]
Found 12 outliers among 100 measurements (12.00%)
5 (5.00%) high mild
7 (7.00%) high severe
HashMap::get time: [7.7062 ns 7.7122 ns 7.7188 ns]
Found 8 outliers among 100 measurements (8.00%)
3 (3.00%) high mild
5 (5.00%) high severe
EnumTable::set time: [287.01 ps 287.12 ps 287.25 ps]
Found 12 outliers among 100 measurements (12.00%)
1 (1.00%) low mild
3 (3.00%) high mild
8 (8.00%) high severe
HashMap::insert time: [9.2064 ns 9.2242 ns 9.2541 ns]
Found 4 outliers among 100 measurements (4.00%)
2 (2.00%) high mild
2 (2.00%) high severe