#reference #owning #field #sibling

owning_ref

A library for creating references that carry their owner with them

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

⚠️ Issues reported

#1307 in Rust patterns

Download history 25052/week @ 2023-11-21 33771/week @ 2023-11-28 25662/week @ 2023-12-05 24950/week @ 2023-12-12 29447/week @ 2023-12-19 10037/week @ 2023-12-26 21315/week @ 2024-01-02 21562/week @ 2024-01-09 22076/week @ 2024-01-16 26357/week @ 2024-01-23 21346/week @ 2024-01-30 23264/week @ 2024-02-06 23481/week @ 2024-02-13 22290/week @ 2024-02-20 28702/week @ 2024-02-27 18781/week @ 2024-03-05

97,510 downloads per month
Used in 582 crates (67 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

~12KB