Skip to content

tesuji/rust-oom

Repository files navigation

oom - One Or Many slice types

Build Status Documentation Crates.io

Took inspirations from the "Parse, don’t validate" article.

This package defines three types: NonEmptySlice, NonEmptyMutSlice and NonEmptyVec. Those types don't implement Deref or DerefMut trait, it is intentional to avoid confusion when resolving methods. If you want &[T], consider using as_slice or as_mut_slice methods.

NonEmptySlice and NonEmptyMutSlice:

  • are borrowed types (not owned type).
  • are counterparts of &[T] and &mut [T].
  • have same size and similar niche as &[T].
  • cannot be used without borrowing contents from array, slice or Vec.

NonEmptyVec:

  • is an owned types, a counterpart of Vec<T>.
  • doesn't have push and pop methods, because those are fallible operations.

The differences from &[T] and Vec<T>:

  • .len() returns std's NonZeroUsize.
  • .is_empty() is always false.
  • These methods don't return None:
    • first
    • first_mut
    • last
    • last_mut
    • split_first
    • split_last
    • split_first_mut
    • split_last_mut

Notable features

  • #![no_std]
  • no external dependencies
  • no macros
  • instant build time.

Supported Rust versions

Latest stable. I use the new conditional flows in const fn available only in Rust v1.46.0.

Usage

Add this to your Cargo.toml:

[dependencies]
oom = "0.3.0"

Or assuming you installed cargo-edit, use:

cargo add oom

Alternatives

That crate uses a representation of:

#[repr(C)]
struct Loaf<T> {
    first: [T; 1],
    rest: [T],
}

and use &Loaf<T> or &mut Loaf at runtime.

Thanks for inspirations from

License

All the code in this repository is released under the MIT License, for more information read the COPYRIGHT file.