@@ -800,6 +800,18 @@ extension Sequence where Element : Equatable {
800
800
}
801
801
}
802
802
803
+ extension ContiguousArray {
804
+ /// Rotates array in place to the left by specified distance.
805
+ @usableFromInline
806
+ mutating func _rotate( left distance: Int ) {
807
+ guard distance > 0 else { return }
808
+ let i = index ( startIndex, offsetBy: distance)
809
+ self [ startIndex..< i] . reverse ( )
810
+ self [ i..< endIndex] . reverse ( )
811
+ self . reverse ( )
812
+ }
813
+ }
814
+
803
815
extension Sequence {
804
816
805
817
/// Returns the longest possible subsequences of the sequence, in order, that
@@ -891,7 +903,7 @@ extension Sequence {
891
903
// Put incoming elements into a ring buffer to save space. Once all
892
904
// elements are consumed, reorder the ring buffer and return it.
893
905
// This saves memory for sequences particularly longer than `maxLength`.
894
- var ringBuffer : [ Element ] = [ ]
906
+ var ringBuffer = ContiguousArray < Element > ( )
895
907
ringBuffer. reserveCapacity ( Swift . min ( maxLength, underestimatedCount) )
896
908
897
909
var i = 0
@@ -901,20 +913,12 @@ extension Sequence {
901
913
ringBuffer. append ( element)
902
914
} else {
903
915
ringBuffer [ i] = element
904
- i += 1
905
- i %= maxLength
916
+ i = ( i + 1 ) % maxLength
906
917
}
907
918
}
908
919
909
- if i != ringBuffer. startIndex {
910
- var rotated : [ Element ] = [ ]
911
- rotated. reserveCapacity ( ringBuffer. count)
912
- rotated += ringBuffer [ i..< ringBuffer. endIndex]
913
- rotated += ringBuffer [ 0 ..< i]
914
- return rotated
915
- } else {
916
- return ringBuffer
917
- }
920
+ ringBuffer. _rotate ( left: i)
921
+ return Array ( ringBuffer)
918
922
}
919
923
920
924
/// Returns a sequence containing all but the given number of initial
0 commit comments