blob: 73851f457fa18233e5431346adfb90254d5cbf67 [file] [log] [blame]
// Copyright 2020 Amari Robinson
//
// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
// http://opensource.org/licenses/MIT>, at your option. This file may not be
// copied, modified, or distributed except according to those terms.
/// Base trait for link operations.
///
/// `LinkPtr` is the representation of a link pointer.
/// Typically this is `NonNull`, but compact representations such
/// as `u8` or `u16` are possible.
pub unsafe trait LinkOps {
/// The link pointer type.
type LinkPtr: Copy + Eq;
/// Attempts to acquire ownership of a link so that it can be used in an
/// intrusive collection.
///
/// If this function succeeds then the intrusive collection will have
/// exclusive access to the link until `release_link` is called.
unsafe fn acquire_link(&mut self, ptr: Self::LinkPtr) -> bool;
/// Releases ownership of a link that was previously acquired with `acquire_link`.
///
/// # Safety
/// An implementation of `release_link` must not panic.
unsafe fn release_link(&mut self, ptr: Self::LinkPtr);
}
/// The default implementation of `LinkOps` associated with a link type.
pub trait DefaultLinkOps {
/// The default link operations.
type Ops: LinkOps + Default;
/// The associated constant that represents `Ops::default()`.
///
/// This exists because `Default::default()` is not a constant function.
const NEW: Self::Ops;
}