use crate::cell::*;
use crate::dict::{AugDictSkipValue, Dict};
use crate::num::{Tokens, VarUint248};
#[derive(Debug, Clone, Eq, PartialEq, Store, Load)]
pub struct CurrencyCollection {
pub tokens: Tokens,
pub other: ExtraCurrencyCollection,
}
impl Default for CurrencyCollection {
#[inline]
fn default() -> Self {
Self::ZERO
}
}
impl CurrencyCollection {
pub const ZERO: Self = Self {
tokens: Tokens::ZERO,
other: ExtraCurrencyCollection::new(),
};
pub const fn new(tokens: u128) -> Self {
Self {
tokens: Tokens::new(tokens),
other: ExtraCurrencyCollection::new(),
}
}
pub const fn bit_len(&self) -> u16 {
self.tokens.unwrap_bit_len() + 1
}
}
impl<'a> AugDictSkipValue<'a> for CurrencyCollection {
#[inline]
fn skip_value(slice: &mut CellSlice<'a>) -> bool {
Tokens::skip_value(slice) && ExtraCurrencyCollection::skip_value(slice)
}
}
#[derive(Debug, Clone, Eq, PartialEq, Store, Load)]
#[repr(transparent)]
pub struct ExtraCurrencyCollection(Dict<CellHash, VarUint248>);
impl Default for ExtraCurrencyCollection {
#[inline]
fn default() -> Self {
Self(Dict::new())
}
}
impl ExtraCurrencyCollection {
pub const fn new() -> Self {
Self(Dict::new())
}
pub const fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub const fn as_dict(&self) -> &Dict<CellHash, VarUint248> {
&self.0
}
}
impl<'a> AugDictSkipValue<'a> for ExtraCurrencyCollection {
#[inline]
fn skip_value(slice: &mut CellSlice<'a>) -> bool {
if let Ok(has_extra) = slice.load_bit() {
!has_extra || slice.try_advance(0, 1)
} else {
false
}
}
}