diff --git a/sway-lib-std/src/primitive_conversions/u16.sw b/sway-lib-std/src/primitive_conversions/u16.sw index bdc6022dde5..9ea79166ca1 100644 --- a/sway-lib-std/src/primitive_conversions/u16.sw +++ b/sway-lib-std/src/primitive_conversions/u16.sw @@ -2,6 +2,7 @@ library; use ::convert::{From, TryFrom}; use ::option::Option::{self, *}; +use ::u128::U128; impl u16 { pub fn try_as_u8(self) -> Option { @@ -81,6 +82,16 @@ impl TryFrom for u16 { } } +impl TryFrom for u16 { + fn try_from(u: U128) -> Option { + if u.upper() == 0 { + >::try_from(u.lower()) + } else { + None + } + } +} + #[test] fn test_u16_from_u8() { use ::assert::assert; @@ -142,3 +153,19 @@ fn test_u16_try_from_u256() { assert(u16_2.is_none()); } + +#[test] +fn test_u16_try_from_U128() { + use ::assert::assert; + + let u128_1: U128 = U128::new(); + let u128_2: U128 = U128::from((0, u16::max().as_u64() + 1)); + + let u16_1 = >::try_from(u128_1); + let u16_2 = >::try_from(u128_2); + + assert(u16_1.is_some()); + assert(u16_1.unwrap() == 0u16); + + assert(u16_2.is_none()); +} diff --git a/sway-lib-std/src/primitive_conversions/u32.sw b/sway-lib-std/src/primitive_conversions/u32.sw index 99f88ec7671..5d34a275b7b 100644 --- a/sway-lib-std/src/primitive_conversions/u32.sw +++ b/sway-lib-std/src/primitive_conversions/u32.sw @@ -2,6 +2,7 @@ library; use ::convert::{From, TryFrom}; use ::option::Option::{self, *}; +use ::u128::U128; impl u32 { pub fn try_as_u8(self) -> Option { @@ -101,6 +102,16 @@ impl TryFrom for u32 { } } +impl TryFrom for u32 { + fn try_from(u: U128) -> Option { + if u.upper() == 0 { + >::try_from(u.lower()) + } else { + None + } + } +} + // TODO: Replace > with u32::from when https://github.com/FuelLabs/sway/issues/5798 is resolved. #[test] fn test_u32_from_u8() { @@ -161,3 +172,19 @@ fn test_u32_try_from_u256() { assert(u32_2.is_none()); } + +#[test] +fn test_u32_try_from_U128() { + use ::assert::assert; + + let u128_1: U128 = U128::new(); + let u128_2: U128 = U128::from((0, u32::max().as_u64() + 1)); + + let u32_1 = >::try_from(u128_1); + let u32_2 = >::try_from(u128_2); + + assert(u32_1.is_some()); + assert(u32_1.unwrap() == 0u32); + + assert(u32_2.is_none()); +} diff --git a/sway-lib-std/src/primitive_conversions/u64.sw b/sway-lib-std/src/primitive_conversions/u64.sw index fd4e98b4a86..246066f4091 100644 --- a/sway-lib-std/src/primitive_conversions/u64.sw +++ b/sway-lib-std/src/primitive_conversions/u64.sw @@ -2,6 +2,7 @@ library; use ::convert::{TryFrom, TryInto, *}; use ::option::Option::{self, *}; +use ::u128::U128; impl u64 { pub fn try_as_u8(self) -> Option { @@ -115,6 +116,16 @@ impl TryFrom for u64 { } } +impl TryFrom for u64 { + fn try_from(u: U128) -> Option { + if u.upper() == 0 { + Some(u.lower()) + } else { + None + } + } +} + // TODO: Replace > with u64::from when https://github.com/FuelLabs/sway/issues/5798 is resolved. #[test] fn test_u64_from_u8() { @@ -173,3 +184,19 @@ fn test_u64_try_from_u256() { assert(u64_2.is_none()); } + +#[test] +fn test_u64_try_from_U128() { + use ::assert::assert; + + let u128_1: U128 = U128::new(); + let u128_2: U128 = U128::from((1, 0)); + + let u64_1 = >::try_from(u128_1); + let u64_2 = >::try_from(u128_2); + + assert(u64_1.is_some()); + assert(u64_1.unwrap() == 0u64); + + assert(u64_2.is_none()); +} diff --git a/sway-lib-std/src/primitive_conversions/u8.sw b/sway-lib-std/src/primitive_conversions/u8.sw index 14c1eaeb560..e638196a817 100644 --- a/sway-lib-std/src/primitive_conversions/u8.sw +++ b/sway-lib-std/src/primitive_conversions/u8.sw @@ -2,6 +2,7 @@ library; use ::convert::TryFrom; use ::option::Option::{self, *}; +use ::u128::U128; impl TryFrom for u8 { fn try_from(u: u16) -> Option { @@ -59,6 +60,16 @@ impl TryFrom for u8 { } } +impl TryFrom for u8 { + fn try_from(u: U128) -> Option { + if u.upper() == 0 { + >::try_from(u.lower()) + } else { + None + } + } +} + #[test] fn test_u8_try_from_u16() { use ::assert::assert; @@ -122,3 +133,19 @@ fn test_u8_try_from_u256() { assert(u8_2.is_none()); } + +#[test] +fn test_u8_try_from_U128() { + use ::assert::assert; + + let u128_1: U128 = U128::new(); + let u128_2: U128 = U128::from((0, u8::max().as_u64() + 1)); + + let u8_1 = >::try_from(u128_1); + let u8_2 = >::try_from(u128_2); + + assert(u8_1.is_some()); + assert(u8_1.unwrap() == 0u8); + + assert(u8_2.is_none()); +}