[][src]Struct ink_storage::Pack

pub struct Pack<T> { /* fields omitted */ }

Packs the inner T so that it only occupies a single contract storage cell.

Note

This is an important modular building stone in order to manage contract storage occupation. By default types try to distribute themselves onto their respective contract storage area. However, upon packing them into Pack<T> they will be compressed to only ever make use of a single contract storage cell. Sometimes this can be advantageous for performance reasons.

Usage

  • A Pack<i32> is equivalent to i32 in its storage occupation.
  • A Pack<(i32, i32)> will occupy a single cell compared to (i32, i32) which occupies a cell per i32.
  • A Lazy<Pack<[u8; 8]>> lazily loads a Pack<[u8; 8]> which occupies a single cell whereas a [u8; 8] would occupy 8 cells in total - one for each u8.
  • Rust collections will never use more than a single cell. So Pack<LinkedList<T>> and LinkedList<T> will occupy the same amount of cells, namely 1.
  • Packs can be packed. So for example a Pack<(Pack<(i32, i32)>, Pack<[u8; 8]>) uses just one cell instead of two cells which is the case for (Pack<(i32, i32)>, Pack<[u8; 8]>).
  • Not all storage types can be packed. Only those that are implementing the PackedLayout trait. For example storage::Vec<T> does not implement this trait and thus cannot be packed.

As a general advice pack values together that are frequently used together. Also pack many very small elements (e.g. u8, bool, u16) together.

Implementations

impl<T> Pack<T>[src]

pub fn new(value: T) -> Self[src]

Creates a new packed value.

pub fn into_inner(pack: Self) -> T[src]

Returns the packed value.

pub fn as_inner(pack: &Pack<T>) -> &T[src]

Returns a shared reference to the packed value.

pub fn as_inner_mut(pack: &mut Pack<T>) -> &mut T[src]

Returns an exclusive reference to the packed value.

Trait Implementations

impl<T> AsMut<T> for Pack<T>[src]

impl<T> AsRef<T> for Pack<T>[src]

impl<T> Borrow<T> for Pack<T>[src]

impl<T> BorrowMut<T> for Pack<T>[src]

impl<T: Clone> Clone for Pack<T>[src]

impl<T: Copy> Copy for Pack<T>[src]

impl<T: Debug> Debug for Pack<T>[src]

impl<T> Decode for Pack<T> where
    T: Decode,
    T: Decode
[src]

impl<T> Default for Pack<T> where
    T: Default
[src]

impl<T> Deref for Pack<T>[src]

type Target = T

The resulting type after dereferencing.

impl<T> DerefMut for Pack<T>[src]

impl<T> Display for Pack<T> where
    T: Display
[src]

impl<T> Encode for Pack<T> where
    T: Encode,
    T: Encode
[src]

impl<T> EncodeLike<Pack<T>> for Pack<T> where
    T: Encode,
    T: Encode
[src]

impl<T> Eq for Pack<T> where
    T: Eq
[src]

impl<T> From<T> for Pack<T>[src]

impl<T> Hash for Pack<T> where
    T: Hash
[src]

impl<T> Ord for Pack<T> where
    T: Ord
[src]

impl<T> PackedLayout for Pack<T> where
    T: PackedLayout
[src]

impl<T> PartialEq<Pack<T>> for Pack<T> where
    T: PartialEq
[src]

impl<T> PartialOrd<Pack<T>> for Pack<T> where
    T: PartialOrd
[src]

impl<T> SpreadLayout for Pack<T> where
    T: PackedLayout
[src]

impl<T> StorageLayout for Pack<T> where
    T: TypeInfo + 'static, 
[src]

Auto Trait Implementations

impl<T> RefUnwindSafe for Pack<T> where
    T: RefUnwindSafe

impl<T> Send for Pack<T> where
    T: Send

impl<T> Sync for Pack<T> where
    T: Sync

impl<T> Unpin for Pack<T> where
    T: Unpin

impl<T> UnwindSafe for Pack<T> where
    T: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T, U> AsByteSlice<T> for U where
    T: ToByteSlice,
    U: AsRef<[T]> + ?Sized

impl<T, U> AsMutByteSlice<T> for U where
    T: ToMutByteSlice,
    U: AsMut<[T]> + ?Sized

impl<U> AsMutSliceOf for U where
    U: AsMut<[u8]> + ?Sized

impl<U> AsSliceOf for U where
    U: AsRef<[u8]> + ?Sized

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<S> Codec for S where
    S: Encode + Decode
[src]

impl<T, X> Decode for X where
    T: Decode + Into<X>,
    X: WrapperTypeDecode<Wrapped = T>, 
[src]

impl<T> DecodeAll for T where
    T: Decode
[src]

impl<T> DecodeLimit for T where
    T: Decode
[src]

impl<T, X> Encode for X where
    T: Encode + ?Sized,
    X: WrapperTypeEncode<Target = T>, 
[src]

impl<'_, '_, T> EncodeLike<&'_ &'_ T> for T where
    T: Encode
[src]

impl<'_, T> EncodeLike<&'_ T> for T where
    T: Encode
[src]

impl<'_, T> EncodeLike<&'_ mut T> for T where
    T: Encode
[src]

impl<T> EncodeLike<Arc<T>> for T where
    T: Encode
[src]

impl<T> EncodeLike<Box<T>> for T where
    T: Encode
[src]

impl<'a, T> EncodeLike<Cow<'a, T>> for T where
    T: Encode + ToOwned
[src]

impl<T> EncodeLike<Rc<T>> for T where
    T: Encode
[src]

impl<T> From<!> for T[src]

impl<T> From<T> for T[src]

impl<S> FullCodec for S where
    S: Decode + FullEncode
[src]

impl<S> FullEncode for S where
    S: Encode + EncodeLike<S>, 
[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> KeyedVec for T where
    T: Codec
[src]

impl<T> Same<T> for T

type Output = T

Should always be Self

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>,