mmch
mmch

Reputation: 25

How to return a struct with references in rust?

I'm using crossbeam-epoch to write a lock-free data structure in rust. crossbeam-epoch uses a guard to load the heap-allocated atomic pointer. One example of the data structure's interface is:

fn get(&self, index: IndexType, guard: &'guard Guard) -> Option<&'guard Value>

This method requires a guard which has the same lifetime with the returned value's reference.

Now, I want to wrap this method without providing a Guard. For example:

struct ReturnType<'guard, Value> {
    guard: Guard,
    value: Option<&'guard Value>
}

impl<'guard, Value> MyDataStructure<Value> {
    fn my_get(&self, index: IndexType) -> ReturnType<'guard, Value> {
        let guard = pin();
        let value = self.get(index, &guard);
        ReturnType {
            guard: guard,
            value: value
        }
    }
}

But the compiler won't allow me to do this.

My question is how to implement the method my_get?

Upvotes: 0

Views: 429

Answers (1)

sb27
sb27

Reputation: 392

This question needs some improvement. You should always add a minimal reproducable example and you haven't shown what the compiler error was either.

Anyways, in your code, you just forget to specify what the lifetime should be linked to. If the guard at least lives as long as self, then you should declare your method with:

fn my_get<'guard>(&'guard self, index: IndexType) -> ReturnType<'guard, Value> {

&'guard self tells the compiler to link 'guard to self. If the guard should live longer than the struct then you have to move the Value or if you want to share the reference use Arc<Value> (Documentation)

Upvotes: 1

Related Questions