1 // Copyright 2020 Amari Robinson
2 //
3 // Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
4 // http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
5 // http://opensource.org/licenses/MIT>, at your option. This file may not be
6 // copied, modified, or distributed except according to those terms.
7 
8 /// Base trait for link operations.
9 ///
10 /// `LinkPtr` is the representation of a link pointer.
11 /// Typically this is `NonNull`, but compact representations such
12 /// as `u8` or `u16` are possible.
13 pub unsafe trait LinkOps {
14     /// The link pointer type.
15     type LinkPtr: Copy + Eq;
16 
17     /// Attempts to acquire ownership of a link so that it can be used in an
18     /// intrusive collection.
19     ///
20     /// If this function succeeds then the intrusive collection will have
21     /// exclusive access to the link until `release_link` is called.
acquire_link(&mut self, ptr: Self::LinkPtr) -> bool22     unsafe fn acquire_link(&mut self, ptr: Self::LinkPtr) -> bool;
23 
24     /// Releases ownership of a link that was previously acquired with `acquire_link`.
25     ///
26     /// # Safety
27     /// An implementation of `release_link` must not panic.
release_link(&mut self, ptr: Self::LinkPtr)28     unsafe fn release_link(&mut self, ptr: Self::LinkPtr);
29 }
30 
31 /// The default implementation of `LinkOps` associated with a link type.
32 pub trait DefaultLinkOps {
33     /// The default link operations.
34     type Ops: LinkOps + Default;
35 
36     /// The associated constant that represents `Ops::default()`.
37     ///
38     /// This exists because `Default::default()` is not a constant function.
39     const NEW: Self::Ops;
40 }
41