Skip to content

oxc-project/oxc-index-vec

Repository files navigation

Crates.io Docs.rs MIT licensed Build Status Sponsors Discord chat

oxc-index-vec

Forked version of index_vec.

Features

This crate provides several optional features:

  • rayon - Enables parallel iteration support via Rayon
  • serde - Enables serialization/deserialization support via Serde
  • nonmax - Enables define_nonmax_u32_index_type! macro for memory-efficient index types using NonMaxU32

Usage

Add this to your Cargo.toml:

[dependencies]
oxc_index = "3.1"

# Enable optional features as needed:
# oxc_index = { version = "3.1", features = ["serde", "nonmax"] }

Basic Index Type

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");

Memory-Efficient Index Type (requires nonmax feature)

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());

Serialization Support (requires serde feature)

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>,
}

Newly Added Features

Compared to the original index_vec:

  • rayon feature - Parallel iteration support
  • serde feature - Automatic serialization support using the crate's own serde dependency
  • nonmax feature - Memory-efficient index types with define_nonmax_u32_index_type! macro
  • Const support - Many methods are now const fn where possible
  • Proc macro compatibility - Macros work seamlessly with custom derive attributes like #[ast], #[estree(skip)], etc.

My sponsors