#[macro_export]
macro_rules! object {
($vis:vis $name:ident { $($field:ident : $type:ty),* }) => {
struct Base {
$(pub $field: $type),*
}
#[derive(Clone,PartialEq)]
$vis struct $name {
base : Armc<Base>,
}
};
}
#[macro_export]
macro_rules! object_with_new {
($vis:vis $name:ident { $($field:ident : $type:ty),* }) => {
struct Base {
$(pub $field: $type),*
}
#[derive(Clone,PartialEq)]
$vis struct $name {
base : Armc<Base>,
}
impl $name {
pub fn new($($field: $type),*) -> Self {
$name {
base: Armc::new(Base {
$($field: $field),*
})
}
}
}
};
}
#[macro_export]
macro_rules! object_ref_access {
($vis:vis $name:ident { $($field:ident : $type:ty),* }) => {
struct Base {
$(pub $field: $type),*
}
#[derive(Clone,PartialEq)]
$vis struct $name {
base : Armc<Base>,
}
impl $name {
pub fn new($($field: $type),*) -> Self {
$name {
base: Armc::new(Base {
$($field: $field),*
})
}
}
$(
// Generate getter
pub fn $field(&self) -> &$type {
&self.base.$field
}
)*
}
};
}
#[macro_export]
macro_rules! object_mut_access {
($vis:vis $name:ident { $($field:ident : $type:ty),* }) => {
struct Base {
$(pub $field: $type),*
}
#[derive(Clone,PartialEq)]
$vis struct $name {
base : Armc<Base>,
}
impl $name {
pub fn new($($field: $type),*) -> Self {
$name {
base: Armc::new(Base {
$($field: $field),*
})
}
}
$(
// Generate getter
pub fn $field(&self) -> &$type {
&self.base.$field
}
)*
}
use paste::paste;
paste! {
impl $name {
$(
pub fn [<$field _mut>] (&mut self, value: $type) -> &mut Self {
self.base.lock().$field = value;
self
}
)*
}
}
};
}