Skip to content

Commit 960bacc

Browse files
committed
Move generic DivRem <T,U> to num/traits/ops and expose legacy bridge
* New file `corelib/src/num/traits/ops/divrem.cairo` – defines the generic `DivRem<T,U>` trait (was in core traits.cairo). – adds the `by_divrem_legacy::Bridge` adapter that maps every existing symmetric `crate::traits::DivRem<T>` implementation to `DivRem<T,T>` so old code keeps compiling. – publishes concrete aliases (`DivRemU8 … DivRemU256`) outside the module, per review guidelines. * `corelib/src/num/traits/ops.cairo` – re-exports `DivRem`, making it part of the public numeric-ops API. * `corelib/src/num/traits.cairo` – bubbles the new trait up alongside the other `num::traits` re-exports. * `corelib/src/traits.cairo` – removes the now-redundant generic-DivRem definition and restores the legacy `DivRem<T>` docs (no longer marked deprecated). These edits address reviewer feedback on PR starkware-libs#7722: • trait must live under `num/traits/ops` • drop the “Generic” suffix • inner adapter module should stay private; concrete `pub impl`s live at top level. All existing tests pass, and the new `divrem` tests in `num_test.cairo` verify both generic and legacy paths.
1 parent ed47382 commit 960bacc

File tree

21 files changed

+1163
-174
lines changed

21 files changed

+1163
-174
lines changed

corelib/src/fixed_size_array.cairo

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::metaprogramming::{SnapRemove, TupleExtendFront, TupleSnapForward, TupleSplit};
2-
use crate::tuple::{SerdeTuple, TuplePartialEq, TuplePartialEqHelper};
2+
use crate::tuple::{DefaultNext, SerdeTuple, TuplePartialEq, TuplePartialEqHelper};
33

44
impl TupleSplitFixedSizedArraySized1<T> of TupleSplit<[T; 1]> {
55
type Head = T;

corelib/src/lib.cairo

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ pub mod traits;
44
use serde::Serde;
55
#[feature("deprecated-index-traits")]
66
#[feature("deprecated-op-assign-traits")]
7-
#[feature("generic-divrem")]
87
#[allow(unused_imports)]
98
use traits::{
109
Add, AddEq, BitAnd, BitNot, BitOr, BitXor, Copy, Default, Destruct, Div, DivEq, DivRem, Drop,

corelib/src/num/traits/ops/divrem.cairo

+12-17
Original file line numberDiff line numberDiff line change
@@ -46,29 +46,24 @@ pub trait DivRem<T, U> {
4646
}
4747

4848
// Compatibility bridge: DivRem<T> → DivRemGeneric<T,T>
49-
mod _divrem_bridge {
50-
#[feature("generic-divrem")]
51-
use crate::traits::DivRem;
52-
use super::DivRem as DivRemGeneric;
53-
49+
mod by_divrem_legacy {
5450
/// Generic adapter: if the old symmetric `DivRem<T>` exists,
5551
/// provide the corresponding `DivRemGeneric<T,T>` implementation.
56-
impl Bridge<T, +DivRem<T>> of DivRemGeneric<T, T> {
52+
pub impl Bridge<T, +crate::traits::DivRem<T>> of super::DivRem<T, T> {
5753
type Quotient = T;
5854
type Remainder = T;
5955

6056
fn div_rem(lhs: T, rhs: NonZero<T>) -> (T, T) {
61-
DivRem::<T>::div_rem(lhs, rhs)
57+
core::traits::DivRem::<T>::div_rem(lhs, rhs)
6258
}
6359
}
64-
65-
// Instantiate the generic adapter for every concrete integer type
66-
// that already has a symmetric `DivRem` implementation.
67-
pub impl BridgeU8 = Bridge<u8>;
68-
pub impl BridgeU16 = Bridge<u16>;
69-
pub impl BridgeU32 = Bridge<u32>;
70-
pub impl BridgeU64 = Bridge<u64>;
71-
pub impl BridgeU128 = Bridge<u128>;
72-
pub impl BridgeU256 = Bridge<u256>;
7360
}
74-
use _divrem_bridge::*;
61+
62+
// Instantiate the generic adapter for every concrete integer type
63+
// that already has a symmetric `DivRem` implementation.
64+
pub impl BridgeU8 = by_divrem_legacy::Bridge<u8>;
65+
pub impl BridgeU16 = by_divrem_legacy::Bridge<u16>;
66+
pub impl BridgeU32 = by_divrem_legacy::Bridge<u32>;
67+
pub impl BridgeU64 = by_divrem_legacy::Bridge<u64>;
68+
pub impl BridgeU128 = by_divrem_legacy::Bridge<u128>;
69+
pub impl BridgeU256 = by_divrem_legacy::Bridge<u256>;

corelib/src/prelude/v2023_01.cairo

+26-26
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,45 @@ pub use starknet::storage::{
22
StorageMapReadAccess, StorageMapWriteAccess, StoragePointerReadAccess,
33
StoragePointerWriteAccess,
44
};
5-
use crate::array::{self, Array, ArrayTrait, Span, SpanTrait, ToSpanTrait};
6-
use crate::box::{self, Box, BoxTrait};
5+
use crate::array::{Array, ArrayTrait, Span, SpanTrait, ToSpanTrait, self};
6+
use crate::box::{Box, BoxTrait, self};
77
use crate::byte_array::{
8-
self, ByteArray, ByteArrayIndexView, ByteArrayStringLiteral, ByteArrayTrait,
8+
ByteArray, ByteArrayIndexView, ByteArrayStringLiteral, ByteArrayTrait, self,
99
};
1010
use crate::bytes_31::{
11-
self, Bytes31IndexView, Bytes31IntoFelt252, Bytes31Trait, Felt252TryIntoBytes31, bytes31,
12-
bytes31_const,
11+
Bytes31IndexView, Bytes31IntoFelt252, Bytes31Trait, Felt252TryIntoBytes31, bytes31,
12+
bytes31_const, self,
1313
};
14-
use crate::clone::{self, Clone};
14+
use crate::clone::{Clone, self};
1515
use crate::dict::{
16-
self, Felt252Dict, Felt252DictTrait, SquashedFelt252Dict, felt252_dict_new, felt252_dict_squash,
16+
Felt252Dict, Felt252DictTrait, SquashedFelt252Dict, felt252_dict_new, felt252_dict_squash, self,
1717
};
18-
use crate::ec::{self, EcOp, EcPoint, EcState};
19-
use crate::gas::{self, BuiltinCosts, GasBuiltin, get_builtin_costs};
18+
use crate::ec::{EcOp, EcPoint, EcState, self};
19+
use crate::gas::{BuiltinCosts, GasBuiltin, get_builtin_costs, self};
2020
use crate::integer::{
21-
self, Bitwise, Felt252IntoU256, Felt252TryIntoU128, Felt252TryIntoU16, Felt252TryIntoU32,
21+
Bitwise, Felt252IntoU256, Felt252TryIntoU128, Felt252TryIntoU16, Felt252TryIntoU32,
2222
Felt252TryIntoU64, Felt252TryIntoU8, I128IntoFelt252, I16IntoFelt252, I32IntoFelt252,
2323
I64IntoFelt252, I8IntoFelt252, NumericLiteral, U128IntoFelt252, U16IntoFelt252, U32IntoFelt252,
24-
U64IntoFelt252, U8IntoFelt252, i128, i16, i32, i64, i8, u128, u128_is_zero, u16, u256, u32, u64,
25-
u8,
24+
U64IntoFelt252, U8IntoFelt252, i128, i16, i32, i64, i8, self, u128, u128_is_zero, u16, u256,
25+
u32, u64, u8,
2626
};
2727
#[feature("corelib-internal-use")]
2828
#[deprecated(feature: "corelib-internal-use", note: "Use `core::num::traits::Sqrt` instead")]
2929
use crate::integer::{u128_sqrt, u256_sqrt};
3030
use crate::iter::{FromIterator, IntoIterator, Iterator};
31-
use crate::nullable::{self, Nullable, NullableTrait, match_nullable, null, nullable_from_box};
31+
use crate::nullable::{Nullable, NullableTrait, match_nullable, null, nullable_from_box, self};
3232
pub use crate::ops::Deref;
33-
use crate::option::Option::{self, None, Some};
34-
use crate::option::{self, OptionTrait};
35-
use crate::panics::{self, Panic, PanicResult, panic};
36-
use crate::pedersen::{self, Pedersen};
37-
use crate::poseidon::{self, Poseidon};
38-
use crate::result::Result::{self, Err, Ok};
39-
use crate::result::{self, ResultTrait};
40-
use crate::serde::{self, Serde};
33+
use crate::option::Option::{None, Some, self};
34+
use crate::option::{OptionTrait, self};
35+
use crate::panics::{Panic, PanicResult, panic, self};
36+
use crate::pedersen::{Pedersen, self};
37+
use crate::poseidon::{Poseidon, self};
38+
use crate::result::Result::{Err, Ok, self};
39+
use crate::result::{ResultTrait, self};
40+
use crate::serde::{Serde, self};
4141
#[feature("corelib-internal-use")]
42-
use crate::starknet::{self, System};
43-
use crate::string::{self, StringLiteral};
42+
use crate::starknet::{System, self};
43+
use crate::string::{StringLiteral, self};
4444
#[cfg(test)]
4545
use crate::test;
4646
#[deprecated(
@@ -68,14 +68,14 @@ pub use crate::traits::RemEq;
6868
)]
6969
#[feature("deprecated-op-assign-traits")]
7070
pub use crate::traits::SubEq;
71-
#[feature("generic-divrem")]
7271
use crate::traits::{
73-
self, Add, BitAnd, BitNot, BitOr, BitXor, Copy, Default, Destruct, Div, DivRem, Drop,
72+
Add, BitAnd, BitNot, BitOr, BitXor, Copy, Default, Destruct, Div, DivRem, Drop,
7473
Felt252DictValue, Into, Mul, Neg, Not, PanicDestruct, PartialEq, PartialOrd, Rem, Sub, TryInto,
74+
self,
7575
};
7676
#[feature("deprecated-index-traits")]
7777
use crate::traits::{Index, IndexView};
78-
use crate::zeroable::{self, NonZero, Zeroable};
78+
use crate::zeroable::{NonZero, Zeroable, self};
7979
use crate::{
8080
BoolBitAnd, BoolBitOr, BoolBitXor, BoolFelt252DictValue, BoolIntoFelt252, BoolNot,
8181
BoolPartialEq, BoolSerde, Felt252Add, Felt252AddEq, Felt252Default, Felt252Felt252DictValue,

corelib/src/prelude/v2023_10.cairo

+3-4
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ pub use crate::integer::{Bitwise, i128, i16, i32, i64, i8, u128, u16, u256, u32,
1313
pub use crate::iter::{FromIterator, IntoIterator, Iterator};
1414
pub use crate::nullable::{Nullable, NullableTrait};
1515
pub use crate::ops::Deref;
16-
pub use crate::option::Option::{self, None, Some};
16+
pub use crate::option::Option::{None, Some, self};
1717
pub use crate::option::OptionTrait;
1818
pub use crate::panics::{Panic, PanicResult, panic};
1919
pub use crate::pedersen::Pedersen;
2020
pub use crate::poseidon::Poseidon;
21-
pub use crate::result::Result::{self, Err, Ok};
21+
pub use crate::result::Result::{Err, Ok, self};
2222
pub use crate::result::ResultTrait;
2323
pub use crate::serde::Serde;
2424
#[feature("corelib-internal-use")]
25-
pub use crate::starknet::{self, System};
25+
pub use crate::starknet::{System, self};
2626
#[deprecated(
2727
feature: "deprecated-op-assign-traits", note: "Use `core::ops::AddAssign`.", since: "2.7.0",
2828
)]
@@ -58,7 +58,6 @@ pub use crate::traits::RemEq;
5858
)]
5959
#[feature("deprecated-op-assign-traits")]
6060
pub use crate::traits::SubEq;
61-
#[feature("generic-divrem")]
6261
pub use crate::traits::{
6362
Add, BitAnd, BitNot, BitOr, BitXor, Copy, Default, Destruct, Div, DivRem, Drop,
6463
Felt252DictValue, Into, Mul, Neg, Not, PanicDestruct, PartialEq, PartialOrd, Rem, Sub, TryInto,

corelib/src/prelude/v2024_07.cairo

+3-4
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,14 @@ pub use crate::integer::{i128, i16, i32, i64, i8, u128, u16, u256, u32, u64, u8}
88
pub use crate::iter::{FromIterator, IntoIterator, Iterator};
99
pub use crate::nullable::{Nullable, NullableTrait};
1010
pub use crate::ops::Deref;
11-
pub use crate::option::Option::{self, None, Some};
11+
pub use crate::option::Option::{None, Some, self};
1212
pub use crate::option::OptionTrait;
1313
pub use crate::panics::{Panic, PanicResult, panic};
14-
pub use crate::result::Result::{self, Err, Ok};
14+
pub use crate::result::Result::{Err, Ok, self};
1515
pub use crate::result::ResultTrait;
1616
pub use crate::serde::Serde;
1717
#[feature("corelib-internal-use")]
18-
pub use crate::starknet::{self, System};
19-
#[feature("generic-divrem")]
18+
pub use crate::starknet::{System, self};
2019
pub use crate::traits::{
2120
Add, Copy, Default, Destruct, Div, DivRem, Drop, Felt252DictValue, Into, Mul, Neg, Not,
2221
PanicDestruct, PartialEq, PartialOrd, Rem, Sub, TryInto,

corelib/src/test/num_test.cairo

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use crate::num::traits::{
33
OverflowingSub, Pow, SaturatingAdd, SaturatingMul, SaturatingSub, WrappingAdd, WrappingMul,
44
WrappingSub,
55
};
6-
#[feature("generic-divrem")]
76
use crate::traits::DivRem as DivRemLegacy;
87
use crate::zeroable::NonZero;
98

corelib/src/traits.cairo

+10-4
Original file line numberDiff line numberDiff line change
@@ -364,11 +364,17 @@ pub trait RemEq<T> {
364364
fn rem_eq(ref self: T, other: T);
365365
}
366366

367-
/// Legacy trait for division with remainder.
367+
/// Performs truncated division and remainder.
368368
///
369-
/// This is kept for backward compatibility.
370-
/// New code should use `crate::num::traits::ops::divrem::DivRem<T, U>` instead.
371-
#[deprecated(feature: "generic-divrem", note: "Use `num::traits::ops::divrem::DivRem`.")]
369+
/// This trait provides a way to efficiently compute both the quotient and remainder in a single
370+
/// operation. The division truncates towards zero, matching the behavior of the `/` and `%`
371+
/// operators.
372+
///
373+
/// # Examples
374+
///
375+
/// ```
376+
/// assert!(DivRem::div_rem(7_u32, 3) == (2, 1));
377+
/// ```
372378
pub trait DivRem<T> {
373379
fn div_rem(lhs: T, rhs: NonZero<T>) -> (T, T);
374380
}

corelib/src/tuple.cairo

+1-1
Original file line numberDiff line numberDiff line change
@@ -747,7 +747,7 @@ impl DefaultTupleBase of Default<()> {
747747
}
748748

749749

750-
impl DefaultNext<
750+
pub(crate) impl DefaultNext<
751751
T,
752752
impl TS: crate::metaprogramming::TupleSplit<T>,
753753
+Default<TS::Head>,

0 commit comments

Comments
 (0)