pub trait EncodeLike<T = Self>: Encode where
    T: Encode
{ }
Expand description

A marker trait that tells the compiler that a type encode to the same representation as another type.

E.g. Vec<u8> has the same encoded representation as &[u8].

Example

fn encode_like<T: Encode, R: EncodeLike<T>>(data: &R) {
    data.encode(); // Valid `T` encoded value.
}

fn main() {
    // Just pass the a reference to the normal tuple.
    encode_like::<(u32, u32), _>(&(1u32, 2u32));
    // Pass a tuple of references
    encode_like::<(u32, u32), _>(&(&1u32, &2u32));
    // Pass a tuple of a reference and a value.
    encode_like::<(u32, u32), _>(&(&1u32, 2u32));
}

Warning

The relation is not symetric, T implements EncodeLike<U> does not mean U has same representation as T. For instance we could imaging a non zero integer to be encoded to the same representation as the said integer but not the other way around.

Limitation

Not all possible implementations of EncodeLike are implemented (for instance Box<Box<u32>> does not implement EncodeLike<u32>). To bypass this issue either open a PR to add the new combination or use Ref reference wrapper or define your own wrapper and implement EncodeLike on it as such:

fn encode_like<T: Encode, R: EncodeLike<T>>(data: &R) {
    data.encode(); // Valid `T` encoded value.
}

struct MyWrapper<'a>(&'a (Box<Box<u32>>, u32));
impl<'a> core::ops::Deref for MyWrapper<'a> { // Or use derive_deref crate
    type Target = (Box<Box<u32>>, u32);
    fn deref(&self) -> &Self::Target { &self.0 }
}

impl<'a> parity_scale_codec::WrapperTypeEncode for MyWrapper<'a> {}
impl<'a> parity_scale_codec::EncodeLike<(u32, u32)> for MyWrapper<'a> {}

fn main() {
    let v = (Box::new(Box::new(0)), 0);
    encode_like::<(u32, u32), _>(&MyWrapper(&v));
}

Implementations on Foreign Types

source

impl EncodeLike<Entry> for Entry

Implementors

impl EncodeLike<Call> for Call

impl<T, A, B> EncodeLike<AnagolayRecord<T, A, B>> for AnagolayRecord<T, A, B> where
    T: Encode,
    T: Encode,
    A: Encode,
    A: Encode,
    B: Encode,
    B: Encode

impl<T: AnagolayStructureData, U: AnagolayStructureExtra> EncodeLike<AnagolayStructure<T, U>> for AnagolayStructure<T, U> where
    T: Encode,
    T: Encode,
    Option<U>: Encode,
    Option<U>: Encode

impl<T: ArtifactType> EncodeLike<AnagolayArtifactStructure<T>> for AnagolayArtifactStructure<T> where
    T: Encode,
    T: Encode

impl<T: Config> EncodeLike<Call<T>> for Call<T>

impl<H, N> EncodeLike<State<H, N>> for State<H, N> where
    Option<(H, N)>: Encode,
    Option<(H, N)>: Encode,
    Option<(H, N)>: Encode,
    Option<(H, N)>: Encode,
    Option<(H, N)>: Encode,
    Option<(H, N)>: Encode

impl<H, N> EncodeLike<Prevote<H, N>> for Prevote<H, N> where
    H: Encode,
    H: Encode,
    N: Encode,
    N: Encode

impl<H, N> EncodeLike<Precommit<H, N>> for Precommit<H, N> where
    H: Encode,
    H: Encode,
    N: Encode,
    N: Encode

impl<H, N> EncodeLike<PrimaryPropose<H, N>> for PrimaryPropose<H, N> where
    H: Encode,
    H: Encode,
    N: Encode,
    N: Encode

impl<Id, V, S> EncodeLike<Equivocation<Id, V, S>> for Equivocation<Id, V, S> where
    Id: Encode,
    Id: Encode,
    V: Encode,
    S: Encode,
    (V, S): Encode,
    V: Encode,
    S: Encode,
    (V, S): Encode

impl<H, N> EncodeLike<Message<H, N>> for Message<H, N> where
    Prevote<H, N>: Encode,
    Prevote<H, N>: Encode,
    Precommit<H, N>: Encode,
    Precommit<H, N>: Encode,
    PrimaryPropose<H, N>: Encode,
    PrimaryPropose<H, N>: Encode

impl<H, N, S, Id> EncodeLike<SignedMessage<H, N, S, Id>> for SignedMessage<H, N, S, Id> where
    Message<H, N>: Encode,
    Message<H, N>: Encode,
    S: Encode,
    S: Encode,
    Id: Encode,
    Id: Encode

impl<H, N, S, Id> EncodeLike<Commit<H, N, S, Id>> for Commit<H, N, S, Id> where
    H: Encode,
    H: Encode,
    N: Encode,
    N: Encode,
    Vec<SignedPrecommit<H, N, S, Id>>: Encode,
    Vec<SignedPrecommit<H, N, S, Id>>: Encode

impl<H, N, S, Id> EncodeLike<SignedPrevote<H, N, S, Id>> for SignedPrevote<H, N, S, Id> where
    Prevote<H, N>: Encode,
    Prevote<H, N>: Encode,
    S: Encode,
    S: Encode,
    Id: Encode,
    Id: Encode

impl<H, N, S, Id> EncodeLike<SignedPrecommit<H, N, S, Id>> for SignedPrecommit<H, N, S, Id> where
    Precommit<H, N>: Encode,
    Precommit<H, N>: Encode,
    S: Encode,
    S: Encode,
    Id: Encode,
    Id: Encode

impl<H, N, S, Id> EncodeLike<CompactCommit<H, N, S, Id>> for CompactCommit<H, N, S, Id> where
    H: Encode,
    H: Encode,
    N: Encode,
    N: Encode,
    Vec<Precommit<H, N>>: Encode,
    Vec<Precommit<H, N>>: Encode,
    MultiAuthData<S, Id>: Encode,
    MultiAuthData<S, Id>: Encode

impl<H, N, S, Id> EncodeLike<CatchUp<H, N, S, Id>> for CatchUp<H, N, S, Id> where
    Vec<SignedPrevote<H, N, S, Id>>: Encode,
    Vec<SignedPrevote<H, N, S, Id>>: Encode,
    Vec<SignedPrecommit<H, N, S, Id>>: Encode,
    Vec<SignedPrecommit<H, N, S, Id>>: Encode,
    H: Encode,
    H: Encode,
    N: Encode,
    N: Encode

impl<H, N, S, Id> EncodeLike<HistoricalVotes<H, N, S, Id>> for HistoricalVotes<H, N, S, Id> where
    Vec<SignedMessage<H, N, S, Id>>: Encode,
    Vec<SignedMessage<H, N, S, Id>>: Encode

impl<H, N, V> EncodeLike<ForkTree<H, N, V>> for ForkTree<H, N, V> where
    Vec<Node<H, N, V>>: Encode,
    Vec<Node<H, N, V>>: Encode,
    Option<N>: Encode,
    Option<N>: Encode

impl<B, O> EncodeLike<DecodeDifferent<B, O>> for DecodeDifferent<B, O> where
    B: Encode + 'static,
    O: Encode + 'static, 

impl<E: Encode> EncodeLike<FnEncode<E>> for FnEncode<E>

impl<T: Config + Send + Sync> EncodeLike<CheckGenesis<T>> for CheckGenesis<T> where
    PhantomData<T>: Encode,
    PhantomData<T>: Encode

impl<T: Config + Send + Sync> EncodeLike<CheckMortality<T>> for CheckMortality<T> where
    PhantomData<T>: Encode,
    PhantomData<T>: Encode

impl<T: Config> EncodeLike<CheckNonce<T>> for CheckNonce<T> where
    T::Index: HasCompact

impl<T: Config + Send + Sync> EncodeLike<CheckSpecVersion<T>> for CheckSpecVersion<T> where
    PhantomData<T>: Encode,
    PhantomData<T>: Encode

impl<T: Config + Send + Sync> EncodeLike<CheckTxVersion<T>> for CheckTxVersion<T> where
    PhantomData<T>: Encode,
    PhantomData<T>: Encode

impl<T: Config + Send + Sync> EncodeLike<CheckWeight<T>> for CheckWeight<T> where
    PhantomData<T>: Encode,
    PhantomData<T>: Encode

impl<T: Config> EncodeLike<Event<T>> for Event<T> where
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode

impl<T: Config> EncodeLike<Call<T>> for Call<T>

impl<E: Parameter + Member, T> EncodeLike<EventRecord<E, T>> for EventRecord<E, T> where
    E: Encode,
    E: Encode,
    Vec<T>: Encode,
    Vec<T>: Encode

impl<AccountId> EncodeLike<RawOrigin<AccountId>> for RawOrigin<AccountId> where
    AccountId: Encode,
    AccountId: Encode

impl<Index, AccountData> EncodeLike<AccountInfo<Index, AccountData>> for AccountInfo<Index, AccountData> where
    Index: Encode,
    Index: Encode,
    AccountData: Encode,
    AccountData: Encode

impl<T: Config> EncodeLike<Event<T>> for Event<T> where
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode

impl<T: Config> EncodeLike<Call<T>> for Call<T>

impl<T: Config> EncodeLike<Call<T>> for Call<T>

impl<T: Config> EncodeLike<Call<T>> for Call<T> where
    Vec<T::Header>: Encode,
    Vec<T::Header>: Encode

impl<T: Config<I>, I: 'static> EncodeLike<Event<T, I>> for Event<T, I> where
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::Balance: Encode,
    T::Balance: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::Balance: Encode,
    T::Balance: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::Balance: Encode,
    T::Balance: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::Balance: Encode,
    T::Balance: Encode,
    T::Balance: Encode,
    T::Balance: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::Balance: Encode,
    T::Balance: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::Balance: Encode,
    T::Balance: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::Balance: Encode,
    T::Balance: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::Balance: Encode,
    T::Balance: Encode

impl<T: Config<I>, I: 'static> EncodeLike<Call<T, I>> for Call<T, I> where
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    T::Balance: HasCompact,
    T::Balance: HasCompact,
    T::Balance: HasCompact,
    T::Balance: HasCompact,
    T::Balance: HasCompact

impl<Balance> EncodeLike<BalanceLock<Balance>> for BalanceLock<Balance> where
    Balance: Encode,
    Balance: Encode

impl<Balance> EncodeLike<AccountData<Balance>> for AccountData<Balance> where
    Balance: Encode,
    Balance: Encode,
    Balance: Encode,
    Balance: Encode,
    Balance: Encode,
    Balance: Encode,
    Balance: Encode,
    Balance: Encode

impl<N> EncodeLike<OldStoredPendingChange<N>> for OldStoredPendingChange<N> where
    N: Encode,
    N: Encode,
    N: Encode,
    N: Encode

impl<N> EncodeLike<StoredPendingChange<N>> for StoredPendingChange<N> where
    N: Encode,
    N: Encode,
    N: Encode,
    N: Encode,
    Option<N>: Encode,
    Option<N>: Encode

impl<N> EncodeLike<StoredState<N>> for StoredState<N> where
    N: Encode,
    N: Encode,
    N: Encode,
    N: Encode,
    N: Encode,
    N: Encode,
    N: Encode,
    N: Encode

impl<T: Config> EncodeLike<Call<T>> for Call<T> where
    EquivocationProof<T::Hash, T::BlockNumber>: Encode,
    EquivocationProof<T::Hash, T::BlockNumber>: Encode,
    T::KeyOwnerProof: Encode,
    T::KeyOwnerProof: Encode,
    EquivocationProof<T::Hash, T::BlockNumber>: Encode,
    EquivocationProof<T::Hash, T::BlockNumber>: Encode,
    T::KeyOwnerProof: Encode,
    T::KeyOwnerProof: Encode,
    T::BlockNumber: Encode,
    T::BlockNumber: Encode,
    T::BlockNumber: Encode,
    T::BlockNumber: Encode

impl<T: Config> EncodeLike<Call<T>> for Call<T>

impl<T: Config> EncodeLike<Call<T>> for Call<T> where
    T::Keys: Encode,
    T::Keys: Encode

impl<T: Config> EncodeLike<Call<T>> for Call<T> where
    Box<<T as Config>::Call>: Encode,
    Box<<T as Config>::Call>: Encode,
    Box<<T as Config>::Call>: Encode,
    Box<<T as Config>::Call>: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    Box<<T as Config>::Call>: Encode,
    Box<<T as Config>::Call>: Encode

impl<AccountId> EncodeLike<RawEvent<AccountId>> for RawEvent<AccountId> where
    AccountId: Encode,
    AccountId: Encode

impl<T: Config> EncodeLike<Call<T>> for Call<T> where
    T::Moment: HasCompact

impl<Balance> EncodeLike<InclusionFee<Balance>> for InclusionFee<Balance> where
    Balance: Encode,
    Balance: Encode,
    Balance: Encode,
    Balance: Encode,
    Balance: Encode,
    Balance: Encode

impl<Balance> EncodeLike<FeeDetails<Balance>> for FeeDetails<Balance> where
    Option<InclusionFee<Balance>>: Encode,
    Option<InclusionFee<Balance>>: Encode,
    Balance: Encode,
    Balance: Encode

impl<Balance> EncodeLike<RuntimeDispatchInfo<Balance>> for RuntimeDispatchInfo<Balance> where
    Balance: Encode,
    Balance: Encode

impl<T: Config> EncodeLike<Call<T>> for Call<T>

impl<T: Config> EncodeLike<Call<T>> for Call<T> where
    Vec<<T as Config>::Call>: Encode,
    Vec<<T as Config>::Call>: Encode,
    Box<<T as Config>::Call>: Encode,
    Box<<T as Config>::Call>: Encode,
    Vec<<T as Config>::Call>: Encode,
    Vec<<T as Config>::Call>: Encode

impl EncodeLike<U128> for U128

impl EncodeLike<U256> for U256

impl EncodeLike<U512> for U512

impl EncodeLike<H128> for H128

impl EncodeLike<H160> for H160

impl EncodeLike<H256> for H256

impl EncodeLike<H512> for H512

impl<Hash, Number, E: Epoch> EncodeLike<EpochChangesV0<Hash, Number, E>> for EpochChangesV0<Hash, Number, E> where
    ForkTree<Hash, Number, PersistedEpoch<E>>: Encode,
    ForkTree<Hash, Number, PersistedEpoch<E>>: Encode

impl<E: Epoch> EncodeLike<EpochHeader<E>> for EpochHeader<E> where
    E::Slot: Encode,
    E::Slot: Encode,
    E::Slot: Encode,
    E::Slot: Encode

impl<E: Epoch> EncodeLike<PersistedEpoch<E>> for PersistedEpoch<E> where
    E: Encode,
    E: Encode,
    E: Encode,
    E: Encode,
    E: Encode,
    E: Encode

impl<E: Epoch> EncodeLike<PersistedEpochHeader<E>> for PersistedEpochHeader<E> where
    EpochHeader<E>: Encode,
    EpochHeader<E>: Encode,
    EpochHeader<E>: Encode,
    EpochHeader<E>: Encode,
    EpochHeader<E>: Encode,
    EpochHeader<E>: Encode

impl<Hash, Number, E: Epoch> EncodeLike<EpochChanges<Hash, Number, E>> for EpochChanges<Hash, Number, E> where
    ForkTree<Hash, Number, PersistedEpochHeader<E>>: Encode,
    ForkTree<Hash, Number, PersistedEpochHeader<E>>: Encode,
    BTreeMap<(Hash, Number), PersistedEpoch<E>>: Encode,
    BTreeMap<(Hash, Number), PersistedEpoch<E>>: Encode

impl<T> EncodeLike<SlotDuration<T>> for SlotDuration<T> where
    T: Encode,
    T: Encode

impl<H, N> EncodeLike<AuthoritySet<H, N>> for AuthoritySet<H, N> where
    ForkTree<H, N, PendingChange<H, N>>: Encode,
    ForkTree<H, N, PendingChange<H, N>>: Encode,
    Vec<PendingChange<H, N>>: Encode,
    Vec<PendingChange<H, N>>: Encode,
    AuthoritySetChanges<N>: Encode,
    AuthoritySetChanges<N>: Encode

impl<Header: HeaderT> EncodeLike<FinalityProof<Header>> for FinalityProof<Header> where
    Header::Hash: Encode,
    Header::Hash: Encode,
    Vec<Header>: Encode,
    Vec<Header>: Encode

impl<Block: BlockT> EncodeLike<GrandpaJustification<Block>> for GrandpaJustification<Block> where
    Commit<Block>: Encode,
    Commit<Block>: Encode,
    Vec<Block::Header>: Encode,
    Vec<Block::Header>: Encode

impl<AuthorityId: Codec> EncodeLike<ConsensusLog<AuthorityId>> for ConsensusLog<AuthorityId> where
    Vec<AuthorityId>: Encode,
    Vec<AuthorityId>: Encode

impl EncodeLike<Slot> for Slot

impl<Header, Id> EncodeLike<EquivocationProof<Header, Id>> for EquivocationProof<Header, Id> where
    Id: Encode,
    Id: Encode,
    Header: Encode,
    Header: Encode,
    Header: Encode,
    Header: Encode

impl EncodeLike<Void> for Void

impl<N> EncodeLike<ScheduledChange<N>> for ScheduledChange<N> where
    N: Encode,
    N: Encode

impl<N: Codec> EncodeLike<ConsensusLog<N>> for ConsensusLog<N> where
    ScheduledChange<N>: Encode,
    ScheduledChange<N>: Encode,
    N: Encode,
    N: Encode,
    ScheduledChange<N>: Encode,
    ScheduledChange<N>: Encode,
    N: Encode,
    N: Encode,
    N: Encode,
    N: Encode

impl<H, N> EncodeLike<EquivocationProof<H, N>> for EquivocationProof<H, N> where
    Equivocation<H, N>: Encode,
    Equivocation<H, N>: Encode

impl<E: Encode> EncodeLike<MakeFatalError<E>> for MakeFatalError<E> where
    E: Encode,
    E: Encode

impl<T: Encode + Decode> EncodeLike<Crossing<T>> for Crossing<T> where
    T: Encode,
    T: Encode

impl<Call, Extra> EncodeLike<SignedPayload<Call, Extra>> for SignedPayload<Call, Extra> where
    Call: Encode,
    Extra: SignedExtension

impl<Address, Call, Signature, Extra> EncodeLike<UncheckedExtrinsic<Address, Call, Signature, Extra>> for UncheckedExtrinsic<Address, Call, Signature, Extra> where
    Address: Encode,
    Signature: Encode,
    Call: Encode,
    Extra: SignedExtension

impl EncodeLike<Era> for Era

impl<Number, Hash> EncodeLike<Header<Number, Hash>> for Header<Number, Hash> where
    Number: HasCompact + Copy + Into<U256> + TryFrom<U256>,
    Hash: HashT,
    Hash::Output: Encode

impl<Header, Extrinsic: MaybeSerialize> EncodeLike<Block<Header, Extrinsic>> for Block<Header, Extrinsic> where
    Header: Encode,
    Header: Encode,
    Vec<Extrinsic>: Encode,
    Vec<Extrinsic>: Encode

impl<Block> EncodeLike<SignedBlock<Block>> for SignedBlock<Block> where
    Block: Encode,
    Block: Encode

impl<Hash> EncodeLike<Digest<Hash>> for Digest<Hash> where
    Vec<DigestItem<Hash>>: Encode,
    Vec<DigestItem<Hash>>: Encode

impl<Hash: Encode> EncodeLike<DigestItem<Hash>> for DigestItem<Hash>

impl<'a, Hash: Encode> EncodeLike<DigestItemRef<'a, Hash>> for DigestItemRef<'a, Hash>

impl EncodeLike<Time> for Time

impl<Xt> EncodeLike<ExtrinsicWrapper<Xt>> for ExtrinsicWrapper<Xt> where
    Xt: Encode,
    Xt: Encode

impl<Xt> EncodeLike<Block<Xt>> for Block<Xt> where
    Vec<Xt>: Encode,
    Vec<Xt>: Encode

impl<Call, Extra> EncodeLike<TestXt<Call, Extra>> for TestXt<Call, Extra> where
    Option<(u64, Extra)>: Encode,
    Option<(u64, Extra)>: Encode,
    Call: Encode,
    Call: Encode

impl<Hashing: Hash> EncodeLike<RandomNumberGenerator<Hashing>> for RandomNumberGenerator<Hashing> where
    Hashing::Output: Encode,
    Hashing::Output: Encode

impl<AccountId, AccountIndex> EncodeLike<MultiAddress<AccountId, AccountIndex>> for MultiAddress<AccountId, AccountIndex> where
    AccountId: Encode,
    AccountId: Encode,
    AccountIndex: HasCompact

impl<Info> EncodeLike<DispatchErrorWithPostInfo<Info>> for DispatchErrorWithPostInfo<Info> where
    Info: Eq + PartialEq + Clone + Copy + Encode + Decode + Printable,
    Info: Encode,
    Info: Encode

impl<Reporter, Offender> EncodeLike<OffenceDetails<Reporter, Offender>> for OffenceDetails<Reporter, Offender> where
    Offender: Encode,
    Offender: Encode,
    Vec<Reporter>: Encode,
    Vec<Reporter>: Encode

impl<T: Config> EncodeLike<Event<T>> for Event<T> where
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode

impl<T: Config> EncodeLike<Call<T>> for Call<T>