ranges-ext-0.1.1 has been yanked.
ranges-ext
A range/interval set data structure designed for no_std + alloc environments.
- Uses half-open range semantics:
[start, end)(i.e.start..end) - Automatically merges overlapping or adjacent ranges
- Supports metadata attached to each range
- Checks whether a value is contained in any range
- Removes a range by subtracting the intersection; can split an existing range into two
- Supports multiple output formats (Debug, Display, hexadecimal, binary, octal, etc.)
Installation
[]
= "0.1"
This crate is #![no_std] by default and depends on alloc.
Basic Usage
use Range;
use RangeSet;
let mut set = new;
// Add ranges (automatically normalized/merged)
set.add_range;
set.add_range;
set.add_range; // Overlaps with previous ranges, will be merged
assert_eq!;
// Query
assert!;
assert!;
// Remove intersection (may trigger splitting)
set.clear;
set.add_range;
set.remove_range;
assert_eq!;
Metadata Usage
The power of this library lies in its support for attaching metadata to each range:
use RangeSet;
let mut set = new;
// Add ranges with metadata
set.add;
set.add; // Overlaps with the previous one, will be merged
set.add;
// Merged ranges preserve all original ranges and metadata
let elements = set.elements;
assert_eq!;
// The first merged range [10,25) contains two original ranges
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
// Adjacent ranges with same metadata are automatically merged
let mut set = new;
set.add;
set.add; // Adjacent with same metadata
set.add; // Will be merged into one original range
assert_eq!;
assert_eq!;
Formatting Output
Supports multiple formatting options:
let mut set = new;
set.add;
set.add;
// Display format: only shows the merged range
println!; // Output: [10..25)
// Debug format: shows detailed information
println!;
// Output: MergedRange { merged: [10..25), originals: [[10..20) → "first", [15..25) → "second"] }
// Hexadecimal format
println!; // Output: [a..19)
// Binary format
println!; // Output: [1010..11001)
API Reference
Constructors
RangeSet<T, M>::new()- Create an empty setRangeSet<T, M>::default()- Create an empty set via Default trait
Range Operations
add(range, meta)- Add a range with metadata and mergeadd_range(range)- Add a range without metadata (only forM = ())extend(ranges)- Batch add multiple ranges (only forM = ())remove_range(range)- Remove range intersection; may trigger splitting
Query Methods
contains(value)- Check if value is contained in any rangeis_empty()- Check if the set is emptylen()- Return the number of merged ranges
Access Methods
elements()- Return slice of internal elements (contains merged ranges and original lists)as_slice()- Return normalized range slice (only ranges, sorted, merged, non-overlapping)iter()- Return iterator of normalized ranges (zero-copy)
Other Methods
clear()- Clear the set
Features
no_stdcompatible: Suitable for embedded and bare-metal environments- Zero-copy iteration:
iter()method returns range references to avoid unnecessary copying - Smart merging: Adjacent/overlapping original ranges with same metadata are automatically merged
- Efficient implementation: Uses binary search to optimize insertion and query performance
- Flexible metadata: Supports any type of metadata, can be
()to indicate no metadata needed
License
Licensed under either MIT or Apache-2.0, at your option.