#![cfg_attr(not(feature = "std"), no_std)]
#[macro_use]
extern crate uint;
#[macro_use]
extern crate fixed_hash;
#[cfg(feature = "impl-serde")]
#[macro_use]
extern crate impl_serde;
#[cfg(feature = "codec-impl")]
#[macro_use]
extern crate codec_impl;
#[cfg(feature = "impl-rlp")]
#[macro_use]
extern crate impl_rlp;
construct_uint! {
pub struct U128(2);
}
construct_uint! {
pub struct U256(4);
}
construct_uint! {
pub struct U512(8);
}
construct_fixed_hash! {
pub struct H160(20);
}
construct_fixed_hash! {
pub struct H256(32);
}
construct_fixed_hash! {
pub struct H512(64);
}
#[cfg(feature = "impl-serde")]
mod serde {
use super::*;
impl_uint_serde!(U128, 2);
impl_uint_serde!(U256, 4);
impl_uint_serde!(U512, 8);
impl_fixed_hash_serde!(H160, 20);
impl_fixed_hash_serde!(H256, 32);
impl_fixed_hash_serde!(H512, 64);
}
#[cfg(feature = "codec-impl")]
mod codec {
use super::*;
impl_uint_codec!(U128, 2);
impl_uint_codec!(U256, 4);
impl_uint_codec!(U512, 8);
impl_fixed_hash_codec!(H160, 20);
impl_fixed_hash_codec!(H256, 32);
impl_fixed_hash_codec!(H512, 64);
}
#[cfg(feature = "impl-rlp")]
mod rlp {
use super::*;
impl_uint_rlp!(U128, 2);
impl_uint_rlp!(U256, 4);
impl_uint_rlp!(U512, 8);
impl_fixed_hash_rlp!(H160, 20);
impl_fixed_hash_rlp!(H256, 32);
impl_fixed_hash_rlp!(H512, 64);
}
impl_fixed_hash_conversions!(H256, H160);
impl U256 {
#[inline(always)]
pub fn full_mul(self, other: U256) -> U512 {
U512(uint_full_mul_reg!(U256, 4, self, other))
}
}
impl From<U256> for U512 {
fn from(value: U256) -> U512 {
let U256(ref arr) = value;
let mut ret = [0; 8];
ret[0] = arr[0];
ret[1] = arr[1];
ret[2] = arr[2];
ret[3] = arr[3];
U512(ret)
}
}
impl From<U512> for U256 {
fn from(value: U512) -> U256 {
let U512(ref arr) = value;
if arr[4] | arr[5] | arr[6] | arr[7] != 0 {
panic!("From<U512> for U256: encountered overflow")
}
let mut ret = [0; 4];
ret[0] = arr[0];
ret[1] = arr[1];
ret[2] = arr[2];
ret[3] = arr[3];
U256(ret)
}
}
impl<'a> From<&'a U256> for U512 {
fn from(value: &'a U256) -> U512 {
let U256(ref arr) = *value;
let mut ret = [0; 8];
ret[0] = arr[0];
ret[1] = arr[1];
ret[2] = arr[2];
ret[3] = arr[3];
U512(ret)
}
}
impl<'a> From<&'a U512> for U256 {
fn from(value: &'a U512) -> U256 {
let U512(ref arr) = *value;
if arr[4] | arr[5] | arr[6] | arr[7] != 0 {
panic!("From<&U512> for U256: encountered overflow")
}
let mut ret = [0; 4];
ret[0] = arr[0];
ret[1] = arr[1];
ret[2] = arr[2];
ret[3] = arr[3];
U256(ret)
}
}