Skip to content

Design for work around trait lifetime issue #559

Closed
@bvssvni

Description

@bvssvni

rust-lang/rust#15191 (comment)

To fix this issue and make Rust-Graphics work with Rust nightlies, the Field is redesigned.

  • This introduces an assumption that all fields are Copy kind
  • The emitted assembly seems to be equivalent Check if compiler optimizes fields by value #555
  • Relies on the compiler to optimize sequential copy-by-value instead of reference to stack value
  • The external look-and-feel of the API remains unchanged
  • No extra generic constraints are required on the impls
  • Can be changed back when Rust solves the issue above - within one day of work
  • Side effect is that let a = b.foo(...).bar(...); is allowed. Will not break future API to change back if the better temporary lifetime RFC is implemented RFC: Better temporary lifetimes (so e.g. .as_slice() works) rust-lang/rfcs#66

The old Field:

pub enum Field<'a, T> {
    Value(T),
    Borrowed(&'a T),
}

impl<'a, T> Field<'a, T> {
    #[inline(always)]
    pub fn get(&'a self) -> &'a T {
        match *self {
            Value(val) => val,
        }
    }
}

The new Field:

pub enum Field<T> {
    Value(T),
}

impl<T: Copy> Field<T> {
    #[inline(always)]
    pub fn get(&self) -> T {
        match *self {
            Value(val) => val,
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions