16 releases

Uses old Rust 2015

0.4.1 Feb 27, 2020
0.4.0 Aug 17, 2018
0.3.3 Mar 9, 2017
0.2.2 Oct 7, 2016
0.1.2 Jul 27, 2015

#23 in Rust patterns

Download history 46792/week @ 2020-04-14 46126/week @ 2020-04-21 47857/week @ 2020-04-28 46836/week @ 2020-05-05 56099/week @ 2020-05-12 56115/week @ 2020-05-19 56254/week @ 2020-05-26 62741/week @ 2020-06-02 55134/week @ 2020-06-09 48205/week @ 2020-06-16 46998/week @ 2020-06-23 43882/week @ 2020-06-30 48773/week @ 2020-07-07 37169/week @ 2020-07-14 41935/week @ 2020-07-21 37036/week @ 2020-07-28

237,238 downloads per month
Used in 356 crates (41 directly)

MIT license

68KB
1K SLoC

Build Status Crate Docs

owning-ref-rs

A library for creating references that carry their owner with them.

This can sometimes be useful because Rust borrowing rules normally prevent moving a type that has been borrowed from. For example, this kind of code gets rejected:

fn return_owned_and_referenced<'a>() -> (Vec<u8>, &'a [u8]) {
    let v = vec![1, 2, 3, 4];
    let s = &v[1..3];
    (v, s)
}

This library enables this safe usage by keeping the owner and the reference bundled together in a wrapper type that ensure that lifetime constraint:

fn return_owned_and_referenced() -> OwningRef<Vec<u8>, [u8]> {
    let v = vec![1, 2, 3, 4];
    let or = OwningRef::new(v);
    let or = or.map(|v| &v[1..3]);
    or
}

Getting Started

To get started, add the following to Cargo.toml.

owning_ref = "0.4.1"

...and see the docs for how to use it.

Example

extern crate owning_ref;
use owning_ref::BoxRef;

fn main() {
    // Create an array owned by a Box.
    let arr = Box::new([1, 2, 3, 4]) as Box<[i32]>;

    // Transfer into a BoxRef.
    let arr: BoxRef<[i32]> = BoxRef::new(arr);
    assert_eq!(&*arr, &[1, 2, 3, 4]);

    // We can slice the array without losing ownership or changing type.
    let arr: BoxRef<[i32]> = arr.map(|arr| &arr[1..3]);
    assert_eq!(&*arr, &[2, 3]);

    // Also works for Arc, Rc, String and Vec!
}

Dependencies

~11KB