#[macro_export]
macro_rules! generate_lockless_aslockhandle {
( $Table:ident
// Table might be a template type.
$(<
// Any number of inner types.
$( $Inner:tt ),*
>)?
) => {
pub struct AsLockWriteGuard<'w, $($($Inner),*)?> {
guard: $crate::lockless::AsLockWriteGuard<'w, $Table $(< $($Inner),* >)?>,
}
impl<'w, $($($Inner),*)?> AsLockWriteGuard<'w, $($($Inner),*)?> {
pub fn update_tables<'a, R>(
&'a mut self,
update: impl $crate::UpdateTables<'a, $Table$(< $($Inner),* >)?, R> + 'static + Sized + Send,
) -> R {
self.guard.update_tables(update)
}
pub fn update_tables_closure<R>(
&mut self,
update: impl Fn(&mut $Table$(< $($Inner),* >)?) -> R + 'static + Sized + Send,
) -> R {
self.guard.update_tables_closure(update)
}
}
impl<'w, $($($Inner),*)?> std::ops::Deref for AsLockWriteGuard<'w, $($($Inner),*)?> {
type Target = $Table$(< $($Inner),* >)?;
fn deref(&self) -> &Self::Target {
&*self.guard
}
}
impl<'w, $($($Inner),*)?> std::fmt::Debug for AsLockWriteGuard<'w, $($($Inner),*)?>
where $Table$(<$($Inner),*>)? : std::fmt::Debug,
{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.guard.fmt(f)
}
}
type AsLockHandleAlias$(< $($Inner),* >)? =
$crate::lockless::AsLockHandle<$Table $(< $($Inner),* >)? >;
#[derive(Clone)]
pub struct AsLockHandle$(< $($Inner),* >)? {
inner: AsLockHandleAlias$(< $($Inner),* >)?,
}
impl$(< $($Inner),* >)? AsLockHandle$(< $($Inner),* >)? {
pub fn from_identical(
t1: $Table $(< $($Inner),* >)?,
t2: $Table $(< $($Inner),* >)?
) -> AsLockHandle$(<$($Inner),*>)? {
AsLockHandle {
inner: AsLockHandleAlias::from_identical(t1, t2)
}
}
pub fn write(&self) -> AsLockWriteGuard<'_, $($($Inner),*)?> {
AsLockWriteGuard {
guard: self.inner.write()
}
}
}
impl$(< $($Inner),* >)? AsLockHandle$(< $($Inner),* >)?
where
$Table$(<$($Inner),*>)? : Clone,
{
pub fn new(t: $Table $(< $($Inner),* >)?) -> AsLockHandle$(<$($Inner),*>)? {
AsLockHandle {
inner: AsLockHandleAlias::from_identical(t.clone(), t)
}
}
}
impl$(< $($Inner),* >)? std::ops::Deref for AsLockHandle$(< $($Inner),* >)? {
type Target = AsLockHandleAlias$(< $($Inner),* >)?;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl$(< $($Inner),* >)? Default for AsLockHandle$(< $($Inner),* >)?
where
AsLockHandleAlias$(< $($Inner),* >)?: Default,
{
fn default() -> Self {
AsLockHandle {
inner: AsLockHandleAlias::default()
}
}
}
impl$(< $($Inner),* >)? std::fmt::Debug for AsLockHandle$(< $($Inner),* >)?
where $Table$(<$($Inner),*>)? : std::fmt::Debug,
{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.inner.fmt(f)
}
}
}
}
#[macro_export]
macro_rules! generate_sync_aslock {
( $Table:ident
// Table might be a template type.
$(<
// Any number of inner types.
$( $Inner:tt ),*
>)?
) => {
pub struct AsLockWriteGuard<'w, $($($Inner),*)?> {
guard: $crate::sync::AsLockWriteGuard<'w, $Table $(< $($Inner),* >)?>,
}
impl<'w, $($($Inner),*)?> AsLockWriteGuard<'w, $($($Inner),*)?> {
pub fn update_tables<'a, R>(
&'a mut self,
update: impl $crate::UpdateTables<'a, $Table$(< $($Inner),* >)?, R> + 'static + Sized + Send,
) -> R {
self.guard.update_tables(update)
}
pub fn update_tables_closure<R>(
&mut self,
update: impl Fn(&mut $Table$(< $($Inner),* >)?) -> R + 'static + Sized + Send,
) -> R {
self.guard.update_tables_closure(update)
}
}
impl<'w, $($($Inner),*)?> std::ops::Deref for AsLockWriteGuard<'w, $($($Inner),*)?> {
type Target = $Table$(< $($Inner),* >)?;
fn deref(&self) -> &Self::Target {
&*self.guard
}
}
impl<'w, $($($Inner),*)?> std::fmt::Debug for AsLockWriteGuard<'w, $($($Inner),*)?>
where $Table$(<$($Inner),*>)? : std::fmt::Debug,
{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.guard.fmt(f)
}
}
type AsLockAlias$(< $($Inner),* >)? =
$crate::sync::AsLock<$Table $(< $($Inner),* >)? >;
pub struct AsLock$(< $($Inner),* >)? {
inner: AsLockAlias$(< $($Inner),* >)?,
}
impl$(< $($Inner),* >)? AsLock$(< $($Inner),* >)? {
pub fn from_identical(
t1: $Table $(< $($Inner),* >)?,
t2: $Table $(< $($Inner),* >)?
) -> AsLock$(<$($Inner),*>)? {
AsLock {
inner: AsLockAlias::from_identical(t1, t2)
}
}
pub fn write(&self) -> AsLockWriteGuard<'_, $($($Inner),*)?> {
AsLockWriteGuard {
guard: self.inner.write()
}
}
}
impl$(< $($Inner),* >)? AsLock$(< $($Inner),* >)?
where
$Table$(<$($Inner),*>)? : Clone,
{
pub fn new(t: $Table $(< $($Inner),* >)?) -> AsLock$(<$($Inner),*>)? {
AsLock {
inner: AsLockAlias::new(t)
}
}
}
impl$(< $($Inner),* >)? std::ops::Deref for AsLock$(< $($Inner),* >)? {
type Target = AsLockAlias$(< $($Inner),* >)?;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl$(< $($Inner),* >)? std::fmt::Debug for AsLock$(< $($Inner),* >)?
where $Table$(<$($Inner),*>)? : std::fmt::Debug,
{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.inner.fmt(f)
}
}
impl$(< $($Inner),* >)? Default for AsLock$(< $($Inner),* >)?
where
AsLockAlias$(< $($Inner),* >)?: Default,
{
fn default() -> Self {
AsLock {
inner: AsLockAlias::default()
}
}
}
}
}
#[macro_export]
macro_rules! assert_tables_eq {
($table:expr, $expected:expr) => {
assert_eq!(*$table.read(), $expected);
assert_eq!(*$table.write(), $expected);
assert_eq!(*$table.read(), $expected);
};
}