#reference #container #pointers

refcon

A reference-behaving type indifferently wrapping reference or immediate values

4 releases

0.2.0 Jun 7, 2024
0.1.2 Jun 7, 2024
0.1.1 Jun 7, 2024
0.1.0 Jun 7, 2024

#1825 in Rust patterns

36 downloads per month

CECILL-C

12KB
88 lines

Crates.ioDocumentation

What is Refcon?

This crate provides the Refcon enum, which is used to wrap either a concrete instance of a type T, or a reference to one.

By implementing AsRef<T>, Refcon lets either variant seamlessly behave as a reference to T.

const ZERO = ABigStruct::costly_initializer();
let v: Vec<ABigStruct> = (0..10_000)
    .map(|i|
         if i < 1_000 {
             Refcon::from(&ZERO)
         } else {
             Refcon::from(ABigStruct::new(i))
         })
    .collect();

// [...]

for x in {
  x.do_something();
}

When not to use Refcon

  • T is smaller than two machine words – you should just copy everything in this case anyways;
  • you can not afford/do not want to pay for the double indirection price while accessing the inner value;
  • you do not want to pay for the price of the additional memory copy while constructing the concrete variant;

When to use Refcon

  • You want to mix values & references: e.g. if you have a vector containing either reference to pre-computed values or ad-hoc ones or if an iterator in a trait may iterate over immediate or reference values depending on the implementation.

No runtime deps