Forked version of index_vec.
This crate provides several optional features:
rayon- Enables parallel iteration support via Rayonserde- Enables serialization/deserialization support via Serdenonmax- Enablesdefine_nonmax_u32_index_type!macro for memory-efficient index types usingNonMaxU32
Add this to your Cargo.toml:
[dependencies] oxc_index = "3.1" # Enable optional features as needed: # oxc_index = { version = "3.1", features = ["serde", "nonmax"] }use oxc_index::{IndexVec, define_index_type}; define_index_type! { pub struct MyIdx = u32; } let mut vec: IndexVec<MyIdx, &str> = IndexVec::new(); let idx = vec.push("hello"); assert_eq!(vec[idx], "hello");The define_nonmax_u32_index_type! macro creates index types backed by NonMaxU32, which uses the niche optimization to store Option<MyIdx> in the same space as MyIdx:
use oxc_index::{IndexVec, define_nonmax_u32_index_type}; define_nonmax_u32_index_type! { pub struct CompactIdx; } // Option<CompactIdx> is the same size as CompactIdx (4 bytes) assert_eq!( std::mem::size_of::<CompactIdx>(), std::mem::size_of::<Option<CompactIdx>>() ); let mut vec: IndexVec<CompactIdx, String> = IndexVec::new(); let idx = vec.push("world".to_string());All index types and IndexVec automatically support Serde serialization when the serde feature is enabled:
use oxc_index::{IndexVec, define_index_type}; use serde::{Serialize, Deserialize}; define_index_type! { pub struct MyIdx = u32; } #[derive(Serialize, Deserialize)] struct MyData { items: IndexVec<MyIdx, String>, }Compared to the original index_vec:
rayonfeature - Parallel iteration supportserdefeature - Automatic serialization support using the crate's own serde dependencynonmaxfeature - Memory-efficient index types withdefine_nonmax_u32_index_type!macro- Const support - Many methods are now
const fnwhere possible - Proc macro compatibility - Macros work seamlessly with custom derive attributes like
#[ast],#[estree(skip)], etc.