From 0850474f03abde534cd3646d6d2615c23bd75326 Mon Sep 17 00:00:00 2001 From: cairoIover <193099744+cairoIover@users.noreply.github.com> Date: Sun, 5 Jan 2025 13:33:15 +0100 Subject: [PATCH 1/6] feat(corelib): IntoIter for Span-convertible @C --- corelib/src/array.cairo | 7 +++++ corelib/src/iter/traits/collect.cairo | 11 ++++---- corelib/src/test/array_test.cairo | 38 +++++++++++++++++++++++---- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/corelib/src/array.cairo b/corelib/src/array.cairo index fb2da32f6da..e287a1f69e3 100644 --- a/corelib/src/array.cairo +++ b/corelib/src/array.cairo @@ -816,6 +816,13 @@ impl SpanIntoIterator of crate::iter::IntoIterator> { } } +impl SnapshotSpanIntoIterator of core::iter::IntoIterator<@Span> { + type IntoIter = core::array::SpanIter; + fn into_iter(self: @Span) -> Self::IntoIter { + (*self).into_iter() + } +} + /// An iterator struct over an array collection. #[derive(Drop)] pub struct ArrayIter { diff --git a/corelib/src/iter/traits/collect.cairo b/corelib/src/iter/traits/collect.cairo index 90a02b3962b..b7ddeb4904f 100644 --- a/corelib/src/iter/traits/collect.cairo +++ b/corelib/src/iter/traits/collect.cairo @@ -96,11 +96,10 @@ impl IteratorIntoIterator> of IntoIterator { } } -impl SnapshotFixedSizeArrayIntoIterator< - T, const SIZE: usize, +Drop, impl ToSpan: core::array::ToSpanTrait<[T; SIZE], T>, -> of IntoIterator<@[T; SIZE]> { - type IntoIter = crate::array::SpanIter; - fn into_iter(self: @[T; SIZE]) -> Self::IntoIter { - ToSpan::span(self).into_iter() +impl SnapshotIteratorSpanBased>> of core::iter::IntoIterator<@C> { + type IntoIter = core::array::SpanIter; + fn into_iter(self: @C) -> Self::IntoIter { + let span: Span = self.into(); + span.into_iter() } } diff --git a/corelib/src/test/array_test.cairo b/corelib/src/test/array_test.cairo index 08889072e2a..6e3d883a8c6 100644 --- a/corelib/src/test/array_test.cairo +++ b/corelib/src/test/array_test.cairo @@ -198,22 +198,50 @@ fn test_array_iterator() { } #[test] -fn test_fixed_size_array_iterator() { - let mut iter = (@[10_usize, 11, 12, 13]).into_iter(); +fn test_snapshot_fixed_size_array_iterator() { + let fixed_arr = [10_usize, 11, 12, 13]; + let mut iter = (@fixed_arr).into_iter(); assert_eq!(iter.next(), Option::Some(@10)); assert_eq!(iter.next(), Option::Some(@11)); assert_eq!(iter.next(), Option::Some(@12)); assert_eq!(iter.next(), Option::Some(@13)); assert!(iter.next().is_none()); + + assert_eq!(fixed_arr.span()[1], @11); } #[test] -fn test_empty_fixed_size_array_iterator() { - let mut input: [usize; 0] = []; - let mut iter = (@input).into_iter(); +fn test_empty_snapshot_fixed_size_array_iterator() { + let mut fixed_arr: [usize; 0] = []; + let mut iter = (@fixed_arr).into_iter(); assert!(iter.next().is_none()); + + assert_eq!(fixed_arr.span().len(), 0); } + +#[test] +fn test_snapshot_array_into_iter() { + let mut arr = array![1, 2, 3, 4, 5]; + let mut arr_iter = (@arr).into_iter(); + + let next = arr_iter.next(); + assert!(next == Option::Some(@1)); + + assert!(arr[1] == @2); +} + +#[test] +fn test_snapshot_span_into_iter() { + let span = array![1, 2, 3, 4, 5].span(); + let mut span_iter = (@span).into_iter(); + let next = span_iter.next(); + assert!(next == Option::Some(@1)); + + assert!(span[1] == @2); +} + +#[test] fn test_array_into_span() { assert_eq!(array![1, 2, 3].span(), array![1, 2, 3].into()) } From c12abade5aace358bc0ed8acd3f3803887922b7a Mon Sep 17 00:00:00 2001 From: cairoIover <193099744+cairoIover@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:27:20 +0100 Subject: [PATCH 2/6] suggestions --- corelib/src/array.cairo | 4 ++-- corelib/src/iter/traits/collect.cairo | 4 ++-- corelib/src/test/array_test.cairo | 29 ++++++++++++--------------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/corelib/src/array.cairo b/corelib/src/array.cairo index e287a1f69e3..df09cf351c1 100644 --- a/corelib/src/array.cairo +++ b/corelib/src/array.cairo @@ -816,8 +816,8 @@ impl SpanIntoIterator of crate::iter::IntoIterator> { } } -impl SnapshotSpanIntoIterator of core::iter::IntoIterator<@Span> { - type IntoIter = core::array::SpanIter; +impl SnapshotSpanIntoIterator of crate::iter::IntoIterator<@Span> { + type IntoIter = crate::array::SpanIter; fn into_iter(self: @Span) -> Self::IntoIter { (*self).into_iter() } diff --git a/corelib/src/iter/traits/collect.cairo b/corelib/src/iter/traits/collect.cairo index b7ddeb4904f..754e87fa6c8 100644 --- a/corelib/src/iter/traits/collect.cairo +++ b/corelib/src/iter/traits/collect.cairo @@ -96,8 +96,8 @@ impl IteratorIntoIterator> of IntoIterator { } } -impl SnapshotIteratorSpanBased>> of core::iter::IntoIterator<@C> { - type IntoIter = core::array::SpanIter; +impl SnapshotIteratorSpanBased>> of IntoIterator<@C> { + type IntoIter = crate::array::SpanIter; fn into_iter(self: @C) -> Self::IntoIter { let span: Span = self.into(); span.into_iter() diff --git a/corelib/src/test/array_test.cairo b/corelib/src/test/array_test.cairo index 6e3d883a8c6..c99c29dc095 100644 --- a/corelib/src/test/array_test.cairo +++ b/corelib/src/test/array_test.cairo @@ -199,24 +199,19 @@ fn test_array_iterator() { #[test] fn test_snapshot_fixed_size_array_iterator() { - let fixed_arr = [10_usize, 11, 12, 13]; - let mut iter = (@fixed_arr).into_iter(); + let mut iter = (@[10_usize, 11, 12, 13]).into_iter(); assert_eq!(iter.next(), Option::Some(@10)); assert_eq!(iter.next(), Option::Some(@11)); assert_eq!(iter.next(), Option::Some(@12)); assert_eq!(iter.next(), Option::Some(@13)); assert!(iter.next().is_none()); - - assert_eq!(fixed_arr.span()[1], @11); } #[test] fn test_empty_snapshot_fixed_size_array_iterator() { - let mut fixed_arr: [usize; 0] = []; - let mut iter = (@fixed_arr).into_iter(); + let mut input: [usize; 0] = []; + let mut iter = (@input).into_iter(); assert!(iter.next().is_none()); - - assert_eq!(fixed_arr.span().len(), 0); } @@ -225,20 +220,22 @@ fn test_snapshot_array_into_iter() { let mut arr = array![1, 2, 3, 4, 5]; let mut arr_iter = (@arr).into_iter(); - let next = arr_iter.next(); - assert!(next == Option::Some(@1)); - - assert!(arr[1] == @2); + let mut i = 1; + while let Option::Some(value) = arr_iter.next() { + assert_eq!(value, @i); + i += 1; + } } #[test] fn test_snapshot_span_into_iter() { let span = array![1, 2, 3, 4, 5].span(); let mut span_iter = (@span).into_iter(); - let next = span_iter.next(); - assert!(next == Option::Some(@1)); - - assert!(span[1] == @2); + let mut i = 1; + while let Option::Some(value) = span_iter.next() { + assert_eq!(value, @i); + i += 1; + } } #[test] From 8e77eb9b8509773858dc69d1ae22bfbed54187b1 Mon Sep 17 00:00:00 2001 From: cairoIover <193099744+cairoIover@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:45:51 +0100 Subject: [PATCH 3/6] suggestions --- corelib/src/test/array_test.cairo | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/corelib/src/test/array_test.cairo b/corelib/src/test/array_test.cairo index c99c29dc095..37152614ba2 100644 --- a/corelib/src/test/array_test.cairo +++ b/corelib/src/test/array_test.cairo @@ -215,27 +215,25 @@ fn test_empty_snapshot_fixed_size_array_iterator() { } -#[test] fn test_snapshot_array_into_iter() { - let mut arr = array![1, 2, 3, 4, 5]; - let mut arr_iter = (@arr).into_iter(); - - let mut i = 1; - while let Option::Some(value) = arr_iter.next() { - assert_eq!(value, @i); - i += 1; - } + let mut iter = (@array![1, 2, 3, 4, 5]).into_iter(); + assert_eq!(iter.next(), Option::Some(@1)); + assert_eq!(iter.next(), Option::Some(@2)); + assert_eq!(iter.next(), Option::Some(@3)); + assert_eq!(iter.next(), Option::Some(@4)); + assert_eq!(iter.next(), Option::Some(@5)); + assert!(iter.next().is_none()); } #[test] fn test_snapshot_span_into_iter() { - let span = array![1, 2, 3, 4, 5].span(); - let mut span_iter = (@span).into_iter(); - let mut i = 1; - while let Option::Some(value) = span_iter.next() { - assert_eq!(value, @i); - i += 1; - } + let mut iter = (@(array![1, 2, 3, 4, 5].span())).into_iter(); + assert_eq!(iter.next(), Option::Some(@1)); + assert_eq!(iter.next(), Option::Some(@2)); + assert_eq!(iter.next(), Option::Some(@3)); + assert_eq!(iter.next(), Option::Some(@4)); + assert_eq!(iter.next(), Option::Some(@5)); + assert!(iter.next().is_none()); } #[test] From 882550a464dbc112deabf21d2171f4a9e0990e27 Mon Sep 17 00:00:00 2001 From: cairoIover <193099744+cairoIover@users.noreply.github.com> Date: Tue, 7 Jan 2025 17:22:29 +0100 Subject: [PATCH 4/6] create 3 explicit impls for IntoIterator for snapshot-collections --- corelib/src/array.cairo | 7 ------- corelib/src/iter/traits/collect.cairo | 23 +++++++++++++++++++---- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/corelib/src/array.cairo b/corelib/src/array.cairo index df09cf351c1..fb2da32f6da 100644 --- a/corelib/src/array.cairo +++ b/corelib/src/array.cairo @@ -816,13 +816,6 @@ impl SpanIntoIterator of crate::iter::IntoIterator> { } } -impl SnapshotSpanIntoIterator of crate::iter::IntoIterator<@Span> { - type IntoIter = crate::array::SpanIter; - fn into_iter(self: @Span) -> Self::IntoIter { - (*self).into_iter() - } -} - /// An iterator struct over an array collection. #[derive(Drop)] pub struct ArrayIter { diff --git a/corelib/src/iter/traits/collect.cairo b/corelib/src/iter/traits/collect.cairo index 754e87fa6c8..2d42db650ad 100644 --- a/corelib/src/iter/traits/collect.cairo +++ b/corelib/src/iter/traits/collect.cairo @@ -96,10 +96,25 @@ impl IteratorIntoIterator> of IntoIterator { } } -impl SnapshotIteratorSpanBased>> of IntoIterator<@C> { +impl SnapshotFixedSizeArrayIntoIterator< + T, const SIZE: usize, +Drop, impl ToSpan: core::array::ToSpanTrait<[T; SIZE], T>, +> of IntoIterator<@[T; SIZE]> { type IntoIter = crate::array::SpanIter; - fn into_iter(self: @C) -> Self::IntoIter { - let span: Span = self.into(); - span.into_iter() + fn into_iter(self: @[T; SIZE]) -> Self::IntoIter { + ToSpan::span(self).into_iter() + } +} + +impl SnapshotSpanIntoIterator of IntoIterator<@Span> { + type IntoIter = crate::array::SpanIter; + fn into_iter(self: @Span) -> Self::IntoIter { + (*self).into_iter() + } +} + +impl SnapshotArrayIntoIterator of IntoIterator<@Array> { + type IntoIter = crate::array::SpanIter; + fn into_iter(self: @Array) -> Self::IntoIter { + self.span().into_iter() } } From 50bf86bcdb1875082546d1a490b1951d53409522 Mon Sep 17 00:00:00 2001 From: cairoIover <193099744+cairoIover@users.noreply.github.com> Date: Wed, 8 Jan 2025 22:10:28 +0100 Subject: [PATCH 5/6] Revert "create 3 explicit impls for IntoIterator for snapshot-collections" This reverts commit 09d696f9812c1b7b3637d929518e9440fbad3cc4. --- corelib/src/array.cairo | 7 +++++++ corelib/src/iter/traits/collect.cairo | 23 ++++------------------- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/corelib/src/array.cairo b/corelib/src/array.cairo index fb2da32f6da..df09cf351c1 100644 --- a/corelib/src/array.cairo +++ b/corelib/src/array.cairo @@ -816,6 +816,13 @@ impl SpanIntoIterator of crate::iter::IntoIterator> { } } +impl SnapshotSpanIntoIterator of crate::iter::IntoIterator<@Span> { + type IntoIter = crate::array::SpanIter; + fn into_iter(self: @Span) -> Self::IntoIter { + (*self).into_iter() + } +} + /// An iterator struct over an array collection. #[derive(Drop)] pub struct ArrayIter { diff --git a/corelib/src/iter/traits/collect.cairo b/corelib/src/iter/traits/collect.cairo index 2d42db650ad..754e87fa6c8 100644 --- a/corelib/src/iter/traits/collect.cairo +++ b/corelib/src/iter/traits/collect.cairo @@ -96,25 +96,10 @@ impl IteratorIntoIterator> of IntoIterator { } } -impl SnapshotFixedSizeArrayIntoIterator< - T, const SIZE: usize, +Drop, impl ToSpan: core::array::ToSpanTrait<[T; SIZE], T>, -> of IntoIterator<@[T; SIZE]> { +impl SnapshotIteratorSpanBased>> of IntoIterator<@C> { type IntoIter = crate::array::SpanIter; - fn into_iter(self: @[T; SIZE]) -> Self::IntoIter { - ToSpan::span(self).into_iter() - } -} - -impl SnapshotSpanIntoIterator of IntoIterator<@Span> { - type IntoIter = crate::array::SpanIter; - fn into_iter(self: @Span) -> Self::IntoIter { - (*self).into_iter() - } -} - -impl SnapshotArrayIntoIterator of IntoIterator<@Array> { - type IntoIter = crate::array::SpanIter; - fn into_iter(self: @Array) -> Self::IntoIter { - self.span().into_iter() + fn into_iter(self: @C) -> Self::IntoIter { + let span: Span = self.into(); + span.into_iter() } } From 99f99d45c3708b15bee3f1477e091f4efea00c33 Mon Sep 17 00:00:00 2001 From: cairoIover <193099744+cairoIover@users.noreply.github.com> Date: Thu, 9 Jan 2025 14:05:11 +0100 Subject: [PATCH 6/6] explicit Span and Array snap into iter --- corelib/src/array.cairo | 7 +++++++ corelib/src/iter/traits/collect.cairo | 9 +++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/corelib/src/array.cairo b/corelib/src/array.cairo index df09cf351c1..f5261b34ba9 100644 --- a/corelib/src/array.cairo +++ b/corelib/src/array.cairo @@ -852,6 +852,13 @@ impl ArrayIntoIterator of crate::iter::IntoIterator> { } } +impl SnapshotArrayIntoIterator of crate::iter::IntoIterator<@Array> { + type IntoIter = SpanIter; + fn into_iter(self: @Array) -> Self::IntoIter { + self.span().into_iter() + } +} + /// Information about a fixed-sized array. trait FixedSizedArrayInfo { /// The type of the elements in the array. diff --git a/corelib/src/iter/traits/collect.cairo b/corelib/src/iter/traits/collect.cairo index 754e87fa6c8..2bd46f011da 100644 --- a/corelib/src/iter/traits/collect.cairo +++ b/corelib/src/iter/traits/collect.cairo @@ -96,10 +96,11 @@ impl IteratorIntoIterator> of IntoIterator { } } -impl SnapshotIteratorSpanBased>> of IntoIterator<@C> { +impl SnapshotFixedSizeArrayIntoIterator< + T, const SIZE: usize, +Drop, impl ToSpan: crate::array::ToSpanTrait<[T; SIZE], T>, +> of IntoIterator<@[T; SIZE]> { type IntoIter = crate::array::SpanIter; - fn into_iter(self: @C) -> Self::IntoIter { - let span: Span = self.into(); - span.into_iter() + fn into_iter(self: @[T; SIZE]) -> Self::IntoIter { + ToSpan::span(self).into_iter() } }