#data-structure #generativity #no-std #lower-bound

no-std indexing

Sound unchecked indexing using “generativity”; a type system approach to indices, pointers and ranges that are trusted to be in bounds

14 releases

0.4.1 Sep 11, 2019
0.3.2 Jan 17, 2018
0.3.1 Nov 19, 2017
0.3.0 Dec 22, 2016
0.1.0 Feb 16, 2016

#869 in Rust patterns

Download history 112/week @ 2022-08-05 151/week @ 2022-08-12 172/week @ 2022-08-19 131/week @ 2022-08-26 70/week @ 2022-09-02 65/week @ 2022-09-09 23/week @ 2022-09-16 20/week @ 2022-09-23 106/week @ 2022-09-30 103/week @ 2022-10-07 101/week @ 2022-10-14 59/week @ 2022-10-21 51/week @ 2022-10-28 57/week @ 2022-11-04 40/week @ 2022-11-11 32/week @ 2022-11-18

195 downloads per month
Used in 2 crates (via gll)




“Sound unchecked indexing” in Rust using “generativity” (branding by unique lifetime parameter).

Extremely experimental, but somewhat promising & exciting.

Main focus is on index ranges, not just single indices.

build_status crates

Crate Features:

  • use_std Enabled by default, disable to be no_std-compatible.


Also now described in: You can't spell trust without Rust. Chapter 6.3 hacking generativity onto rust. Gankro's master's thesis.

Recent Changes

  • 0.4.1
    • Remove the ability to clone non- FixedLength Containers, because allowing to clone a container was wrong in the presencen of the length changing .push()/.insert() methods on vectors in containers.
  • 0.4.0
    • Add method .make_twin() that allows two or more containers to use the same trusted indices, if they are the same size
    • Add new marker trait FixedLength for use in make_twin.
    • Remove the branded raw pointer features, since they need revision (See #11)
    • Fix bug in the proof of .join_cover()
    • Fix signatures in ContiguousMut so that it now uses &mut correctly
    • Update dev-dependencies
    • Add Ord, PartialOrd impls for Range
    • Now using Rust 2018 and requiring Rust 1.32 or later.
  • 0.3.2
    • Fix future compatibility warning about pointer casts.
    • Add Ord, Hash impls for Index and Hash for Range
  • 0.3.1
    • Fixes in tests
    • Add crates.io categories
  • 0.3.0
    • Tweak implementation traits a bit, PointerRange, Provable, ContainerRef, make them unsafe where needed.
    • Add Container::range_of
  • 0.2.0
    • Docs are better
    • Refactor most of the crate, prepare for other backends than slices
    • Expose PIndex, PRange, PSlice which are the pointer-based equivalents of safe trusted indices and ranges. Some algos are better when using a raw pointer representation (for example: lower bound). Since we don't have HKT, traitifying all of this is not so pleasant and is not yet complete.
    • New feature: can combine trusted indices with push/insert on Vec.
  • 0.1.2
    • Add binary_search_by and lower_bound to algorithms. Algorithms don't require T: Debug anymore.
  • 0.1.1
    • Point documentation to docs.rs
  • 0.1.0
    • Add some docs and tests
    • Fix Range::join_cover_both to use ProofAdd
  • 0.1.0-alpha3
    • Add IndexingError and use it for all Results.
  • 0.1.0-alpha2
    • Add ProofAdd and use it in Range::join, Range::join_cover
    • Make Index<'id>, Range<'id> Send + Sync
  • 0.1.0-alpha1
    • First release


Dual-licensed to be compatible with the Rust project.

Licensed under the Apache License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0 or the MIT license http://opensource.org/licenses/MIT, at your option. This file may not be copied, modified, or distributed except according to those terms.


~84K SLoC