Skip to content

Commit 66bc166

Browse files
authored
Merge pull request #21658 from palimondo/within-one-stem
[stdlib] Use ContiguousArray internally in Sequence dropLast, prefix, suffix
2 parents 43f68ca + c887116 commit 66bc166

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed

stdlib/public/core/Sequence.swift

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -893,10 +893,9 @@ extension Sequence {
893893

894894
// FIXME: <rdar://problem/21885650> Create reusable RingBuffer<T>
895895
// Put incoming elements into a ring buffer to save space. Once all
896-
// elements are consumed, reorder the ring buffer into an `Array`
897-
// and return it. This saves memory for sequences particularly longer
898-
// than `maxLength`.
899-
var ringBuffer: [Element] = []
896+
// elements are consumed, reorder the ring buffer into a copy and return it.
897+
// This saves memory for sequences particularly longer than `maxLength`.
898+
var ringBuffer = ContiguousArray<Element>()
900899
ringBuffer.reserveCapacity(Swift.min(maxLength, underestimatedCount))
901900

902901
var i = 0
@@ -906,19 +905,18 @@ extension Sequence {
906905
ringBuffer.append(element)
907906
} else {
908907
ringBuffer[i] = element
909-
i += 1
910-
i %= maxLength
908+
i = (i + 1) % maxLength
911909
}
912910
}
913911

914912
if i != ringBuffer.startIndex {
915-
var rotated: [Element] = []
913+
var rotated = ContiguousArray<Element>()
916914
rotated.reserveCapacity(ringBuffer.count)
917915
rotated += ringBuffer[i..<ringBuffer.endIndex]
918916
rotated += ringBuffer[0..<i]
919-
return rotated
920-
} else {
921-
return ringBuffer
917+
return Array(rotated)
918+
} else {
919+
return Array(ringBuffer)
922920
}
923921
}
924922

@@ -976,8 +974,8 @@ extension Sequence {
976974
// holding tank into the result, an `Array`. This saves
977975
// `k` * sizeof(Element) of memory, because slices keep the entire
978976
// memory of an `Array` alive.
979-
var result: [Element] = []
980-
var ringBuffer: [Element] = []
977+
var result = ContiguousArray<Element>()
978+
var ringBuffer = ContiguousArray<Element>()
981979
var i = ringBuffer.startIndex
982980

983981
for element in self {
@@ -986,11 +984,10 @@ extension Sequence {
986984
} else {
987985
result.append(ringBuffer[i])
988986
ringBuffer[i] = element
989-
i += 1
990-
i %= k
987+
i = (i + 1) % k
991988
}
992989
}
993-
return result
990+
return Array(result)
994991
}
995992

996993
/// Returns a sequence by skipping the initial, consecutive elements that
@@ -1072,15 +1069,15 @@ extension Sequence {
10721069
public __consuming func prefix(
10731070
while predicate: (Element) throws -> Bool
10741071
) rethrows -> [Element] {
1075-
var result: [Element] = []
1072+
var result = ContiguousArray<Element>()
10761073

10771074
for element in self {
10781075
guard try predicate(element) else {
10791076
break
10801077
}
10811078
result.append(element)
10821079
}
1083-
return result
1080+
return Array(result)
10841081
}
10851082
}
10861083

0 commit comments

Comments
 (0)