Implement wrapper helper traits
Change-Id: I4d389d18a8b55a648532062804bb28e806c93a0c
This commit is contained in:
parent
88a94a9129
commit
2202a38c65
|
@ -618,3 +618,115 @@ macro_rules! solitaire {
|
|||
entrypoint!(solitaire);
|
||||
}
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! info_wrapper {
|
||||
($name:ident) => {
|
||||
pub struct $name<'b>(Info<'b>);
|
||||
|
||||
impl<'b> Deref for $name<'b> {
|
||||
type Target = Info<'b>;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
return &self.0;
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> Keyed for $name<'b> {
|
||||
fn pubkey(&self) -> &Pubkey {
|
||||
self.key
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b: 'a, 'c> Peel<'a, 'b, 'c> for $name<'b> {
|
||||
fn peel<T>(ctx: &'c mut Context<'a, 'b, 'c, T>) -> Result<Self>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
return Ok($name(ctx.info().clone()));
|
||||
}
|
||||
}
|
||||
};
|
||||
($name:ident, size: $size:expr) => {
|
||||
#[repr(transparent)]
|
||||
pub struct $name<'b>(Info<'b>);
|
||||
|
||||
impl<'b> Deref for $name<'b> {
|
||||
type Target = Info<'b>;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
unsafe { std::mem::transmute(&self.0) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> DerefMut for $name<'b> {
|
||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||
unsafe { std::mem::transmute(&mut self.0) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> AccountSize for $name<'b> {
|
||||
fn size(&self) -> usize {
|
||||
return $size;
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> Keyed for $name<'b> {
|
||||
fn pubkey(&self) -> &Pubkey {
|
||||
self.key
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b: 'a, 'c> Peel<'a, 'b, 'c> for $name<'b> {
|
||||
fn peel<T>(ctx: &'c mut Context<'a, 'b, 'c, T>) -> Result<Self>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
Ok($name(ctx.info().clone()))
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! data_wrapper {
|
||||
($name:ident, $embed:ty) => {
|
||||
#[repr(transparent)]
|
||||
pub struct $name<'b>(Data<'b, $embed>);
|
||||
|
||||
impl<'b> Deref for $name<'b> {
|
||||
type Target = Data<'b, $embed>;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
return &self.0;
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> DerefMut for $name<'b> {
|
||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||
unsafe { std::mem::transmute(&mut self.0) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> Keyed for $name<'b> {
|
||||
fn pubkey(&self) -> &Pubkey {
|
||||
self.0.pubkey()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> AccountSize for $name<'b> {
|
||||
fn size(&self) -> usize {
|
||||
return self.0.size();
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b: 'a, 'c> Peel<'a, 'b, 'c> for $name<'b> {
|
||||
fn peel<T>(ctx: &'c mut Context<'a, 'b, 'c, T>) -> Result<Self>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
Data::peel(ctx).map(|v| $name(v))
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue