@@ -1542,6 +1542,36 @@ extern fn upcast<FromType, ToType>(x: FromType) -> ToType nopanic;
1542
1542
// will not lead to Sierra errors.
1543
1543
extern fn downcast <FromType , ToType >(x : FromType ) -> Option <ToType > implicits (RangeCheck ) nopanic ;
1544
1544
1545
+ // Marks `FromType` as upcastable to `ToType`.
1546
+ // Do not add user code implementing this trait.
1547
+ trait Upcastable <FromType , ToType >;
1548
+ impl UpcastableU8U16 of Upcastable <u8 , u16 > {}
1549
+ impl UpcastableU8U32 of Upcastable <u8 , u32 > {}
1550
+ impl UpcastableU8U64 of Upcastable <u8 , u64 > {}
1551
+ impl UpcastableU8U128 of Upcastable <u8 , u128 > {}
1552
+ impl UpcastableU16U32 of Upcastable <u16 , u32 > {}
1553
+ impl UpcastableU16U64 of Upcastable <u16 , u64 > {}
1554
+ impl UpcastableU16U128 of Upcastable <u16 , u128 > {}
1555
+ impl UpcastableU32U64 of Upcastable <u32 , u64 > {}
1556
+ impl UpcastableU32U128 of Upcastable <u32 , u128 > {}
1557
+ impl UpcastableU64U128 of Upcastable <u64 , u128 > {}
1558
+ // Marks `FromType` as downcastable to `ToType`.
1559
+ // Do not add user code implementing this trait.
1560
+ trait Downcastable <FromType , ToType >;
1561
+ impl DowncastableU128U64 of Downcastable <u128 , u64 > {}
1562
+ impl DowncastableU128U32 of Downcastable <u128 , u32 > {}
1563
+ impl DowncastableU128U16 of Downcastable <u128 , u16 > {}
1564
+ impl DowncastableU128U8 of Downcastable <u128 , u8 > {}
1565
+
1566
+ impl DowncastableU64U32 of Downcastable <u64 , u32 > {}
1567
+ impl DowncastableU64U16 of Downcastable <u64 , u16 > {}
1568
+ impl DowncastableU64U8 of Downcastable <u64 , u8 > {}
1569
+
1570
+ impl DowncastableU32U16 of Downcastable <u32 , u16 > {}
1571
+ impl DowncastableU32U8 of Downcastable <u32 , u8 > {}
1572
+
1573
+ impl DowncastableU16U8 of Downcastable <u16 , u8 > {}
1574
+
1545
1575
/// Default values
1546
1576
impl U8Default of Default <u8 > {
1547
1577
#[inline(always)]
@@ -1622,50 +1652,16 @@ impl U128Felt252DictValue of Felt252DictValue<u128> {
1622
1652
}
1623
1653
}
1624
1654
1625
- impl U8IntoU16 of Into <u8 , u16 > {
1626
- fn into (self : u8 ) -> u16 {
1627
- upcast (self )
1628
- }
1629
- }
1630
-
1631
- impl U16TryIntoU8 of TryInto <u16 , u8 > {
1632
- fn try_into (self : u16 ) -> Option <u8 > {
1633
- downcast (self )
1634
- }
1635
- }
1636
-
1637
- impl U8IntoU32 of Into <u8 , u32 > {
1638
- fn into (self : u8 ) -> u32 {
1655
+ impl UpcastableInto <From , To , impl FromToUpcastable : Upcastable <From , To >> of Into <From , To > {
1656
+ fn into (self : From ) -> To {
1639
1657
upcast (self )
1640
1658
}
1641
1659
}
1642
1660
1643
- impl U32TryIntoU8 of TryInto <u32 , u8 > {
1644
- fn try_into (self : u32 ) -> Option <u8 > {
1645
- downcast (self )
1646
- }
1647
- }
1648
-
1649
- impl U8IntoU64 of Into <u8 , u64 > {
1650
- fn into (self : u8 ) -> u64 {
1651
- upcast (self )
1652
- }
1653
- }
1654
-
1655
- impl U64TryIntoU8 of TryInto <u64 , u8 > {
1656
- fn try_into (self : u64 ) -> Option <u8 > {
1657
- downcast (self )
1658
- }
1659
- }
1660
-
1661
- impl U8IntoU128 of Into <u8 , u128 > {
1662
- fn into (self : u8 ) -> u128 {
1663
- upcast (self )
1664
- }
1665
- }
1666
-
1667
- impl U128TryIntoU8 of TryInto <u128 , u8 > {
1668
- fn try_into (self : u128 ) -> Option <u8 > {
1661
+ impl DowncastableTryInto <
1662
+ From , To , impl FromToDowncastable : Downcastable <From , To >
1663
+ > of TryInto <From , To > {
1664
+ fn try_into (self : From ) -> Option <To > {
1669
1665
downcast (self )
1670
1666
}
1671
1667
}
@@ -1688,42 +1684,6 @@ impl U256TryIntoU8 of TryInto<u256, u8> {
1688
1684
}
1689
1685
}
1690
1686
1691
- impl U16IntoU32 of Into <u16 , u32 > {
1692
- fn into (self : u16 ) -> u32 {
1693
- upcast (self )
1694
- }
1695
- }
1696
-
1697
- impl U32TryIntoU16 of TryInto <u32 , u16 > {
1698
- fn try_into (self : u32 ) -> Option <u16 > {
1699
- downcast (self )
1700
- }
1701
- }
1702
-
1703
- impl U16IntoU64 of Into <u16 , u64 > {
1704
- fn into (self : u16 ) -> u64 {
1705
- upcast (self )
1706
- }
1707
- }
1708
-
1709
- impl U64TryIntoU16 of TryInto <u64 , u16 > {
1710
- fn try_into (self : u64 ) -> Option <u16 > {
1711
- downcast (self )
1712
- }
1713
- }
1714
-
1715
- impl U16IntoU128 of Into <u16 , u128 > {
1716
- fn into (self : u16 ) -> u128 {
1717
- upcast (self )
1718
- }
1719
- }
1720
-
1721
- impl U128TryIntoU16 of TryInto <u128 , u16 > {
1722
- fn try_into (self : u128 ) -> Option <u16 > {
1723
- downcast (self )
1724
- }
1725
- }
1726
-
1727
1687
impl U16IntoU256 of Into <u16 , u256 > {
1728
1688
fn into (self : u16 ) -> u256 {
1729
1689
u256 { low : upcast (self ), high : 0_u128 }
@@ -1742,30 +1702,6 @@ impl U256TryIntoU16 of TryInto<u256, u16> {
1742
1702
}
1743
1703
}
1744
1704
1745
- impl U32IntoU64 of Into <u32 , u64 > {
1746
- fn into (self : u32 ) -> u64 {
1747
- upcast (self )
1748
- }
1749
- }
1750
-
1751
- impl U64TryIntoU32 of TryInto <u64 , u32 > {
1752
- fn try_into (self : u64 ) -> Option <u32 > {
1753
- downcast (self )
1754
- }
1755
- }
1756
-
1757
- impl U32IntoU128 of Into <u32 , u128 > {
1758
- fn into (self : u32 ) -> u128 {
1759
- upcast (self )
1760
- }
1761
- }
1762
-
1763
- impl U128TryIntoU32 of TryInto <u128 , u32 > {
1764
- fn try_into (self : u128 ) -> Option <u32 > {
1765
- downcast (self )
1766
- }
1767
- }
1768
-
1769
1705
impl U32IntoU256 of Into <u32 , u256 > {
1770
1706
fn into (self : u32 ) -> u256 {
1771
1707
u256 { low : upcast (self ), high : 0_u128 }
@@ -1784,18 +1720,6 @@ impl U256TryIntoU32 of TryInto<u256, u32> {
1784
1720
}
1785
1721
}
1786
1722
1787
- impl U64IntoU128 of Into <u64 , u128 > {
1788
- fn into (self : u64 ) -> u128 {
1789
- upcast (self )
1790
- }
1791
- }
1792
-
1793
- impl U128TryIntoU64 of TryInto <u128 , u64 > {
1794
- fn try_into (self : u128 ) -> Option <u64 > {
1795
- downcast (self )
1796
- }
1797
- }
1798
-
1799
1723
impl U64IntoU256 of Into <u64 , u256 > {
1800
1724
fn into (self : u64 ) -> u256 {
1801
1725
u256 { low : upcast (self ), high : 0_u128 }
@@ -1832,7 +1756,6 @@ impl U256TryIntoU128 of TryInto<u256, u128> {
1832
1756
}
1833
1757
}
1834
1758
1835
-
1836
1759
// === Zeroable ===
1837
1760
1838
1761
impl U8Zeroable of Zeroable <u8 > {
0 commit comments