Skip to content

cyberia-ng/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.

Packages

No packages published

Languages

  • Rust 100.0%