Skip to content

Commit 824bccc

Browse files
committed
stdlib: change Collection._copyToNativeArrayBuffer() to be defined in terms of public types
1 parent cd59716 commit 824bccc

16 files changed

+86
-77
lines changed

stdlib/private/StdlibCollectionUnittest/LoggingWrappers.swift.gyb

+5-5
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public class SequenceLog {
8989
public static var split = TypeIndexed(0)
9090
public static var _customContainsEquatableElement = TypeIndexed(0)
9191
public static var _preprocessingPass = TypeIndexed(0)
92-
public static var _copyToNativeArrayBuffer = TypeIndexed(0)
92+
public static var _copyToContiguousArray = TypeIndexed(0)
9393
public static var _copyContents = TypeIndexed(0)
9494
}
9595

@@ -302,10 +302,10 @@ public struct ${Self}<
302302

303303
/// Create a native array buffer containing the elements of `self`,
304304
/// in the same order.
305-
public func _copyToNativeArrayBuffer()
306-
-> _ContiguousArrayBuffer<Base.Iterator.Element> {
307-
Log._copyToNativeArrayBuffer[selfType] += 1
308-
return base._copyToNativeArrayBuffer()
305+
public func _copyToContiguousArray()
306+
-> ContiguousArray<Base.Iterator.Element> {
307+
Log._copyToContiguousArray[selfType] += 1
308+
return base._copyToContiguousArray()
309309
}
310310

311311
/// Copy a Sequence into an array.

stdlib/public/core/Arrays.swift.gyb

+19-9
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,7 @@ extension ${Self} : ArrayLiteralConvertible {
936936
///
937937
/// - Parameter elements: A variadic list of elements of the new array.
938938
public init(arrayLiteral elements: Element...) {
939-
self.init(_buffer: _extractOrCopyToNativeArrayBuffer(elements._buffer))
939+
self.init(_buffer: _extractOrCopyToContiguousArray(elements._buffer)._buffer)
940940
}
941941
%end
942942
}
@@ -1037,7 +1037,8 @@ extension ${Self} : RangeReplaceableCollection, _ArrayProtocol {
10371037
public init<S : Sequence>(_ s: S)
10381038
where S.Iterator.Element == Element {
10391039

1040-
self = ${Self}(_buffer: _Buffer(s._copyToNativeArrayBuffer(),
1040+
self = ${Self}(
1041+
_buffer: _Buffer(s._copyToContiguousArray()._buffer,
10411042
shiftedToStartIndex: 0))
10421043
}
10431044

@@ -1426,8 +1427,8 @@ extension ${Self} : RangeReplaceableCollection, _ArrayProtocol {
14261427
}
14271428
}
14281429

1429-
public func _copyToNativeArrayBuffer() -> _ContiguousArrayBuffer<Element> {
1430-
return _extractOrCopyToNativeArrayBuffer(self._buffer)
1430+
public func _copyToContiguousArray() -> ContiguousArray<Element> {
1431+
return _extractOrCopyToContiguousArray(self._buffer)
14311432
}
14321433
}
14331434

@@ -1976,18 +1977,27 @@ internal func _arrayReserve<_Buffer>(
19761977
_arrayOutOfPlaceUpdate(&buffer, &newBuffer, count, 0, _IgnorePointer())
19771978
}
19781979

1979-
public // SPI(Foundation)
1980-
func _extractOrCopyToNativeArrayBuffer<Buffer>(
1980+
internal func _extractOrCopyToContiguousArray<Buffer>(
19811981
_ source: Buffer
1982-
) -> _ContiguousArrayBuffer<Buffer.Iterator.Element>
1982+
) -> ContiguousArray<Buffer.Iterator.Element>
19831983
where
19841984
Buffer : _ArrayBufferProtocol,
19851985
Buffer.Iterator.Element == Buffer.Element {
19861986

19871987
if let n = source.requestNativeBuffer() {
1988-
return n
1988+
return ContiguousArray(_buffer: n)
19891989
}
1990-
return _copyCollectionToNativeArrayBuffer(source)
1990+
return _copyCollectionToContiguousArray(source)
1991+
}
1992+
1993+
internal func _extractOrCopyToNativeArrayBuffer<Buffer>(
1994+
_ source: Buffer
1995+
) -> _ContiguousArrayBuffer<Buffer.Iterator.Element>
1996+
where
1997+
Buffer : _ArrayBufferProtocol,
1998+
Buffer.Iterator.Element == Buffer.Element {
1999+
2000+
return _extractOrCopyToContiguousArray(source)._buffer
19912001
}
19922002

19932003
/// Append items from `newItems` to `buffer`.

stdlib/public/core/ContiguousArrayBuffer.swift

+18-19
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ final class _ContiguousArrayStorage<Element> : _ContiguousArrayStorage1 {
183183
}
184184

185185
@_fixed_layout
186-
public struct _ContiguousArrayBuffer<Element> : _ArrayBufferProtocol {
186+
public // @testable
187+
struct _ContiguousArrayBuffer<Element> : _ArrayBufferProtocol {
187188

188189
/// Make a buffer with uninitialized elements. After using this
189190
/// method, you must either initialize the `count` elements at the
@@ -539,15 +540,14 @@ extension _ContiguousArrayBuffer : RandomAccessCollection {
539540
}
540541

541542
extension Sequence {
542-
public func _copyToNativeArrayBuffer()
543-
-> _ContiguousArrayBuffer<Iterator.Element> {
544-
return _copySequenceToNativeArrayBuffer(self)
543+
public func _copyToContiguousArray() -> ContiguousArray<Iterator.Element> {
544+
return _copySequenceToContiguousArray(self)
545545
}
546546
}
547547

548-
internal func _copySequenceToNativeArrayBuffer<
548+
internal func _copySequenceToContiguousArray<
549549
S : Sequence
550-
>(_ source: S) -> _ContiguousArrayBuffer<S.Iterator.Element> {
550+
>(_ source: S) -> ContiguousArray<S.Iterator.Element> {
551551
let initialCapacity = source.underestimatedCount
552552
var builder =
553553
_UnsafePartiallyInitializedContiguousArrayBuffer<S.Iterator.Element>(
@@ -571,33 +571,32 @@ internal func _copySequenceToNativeArrayBuffer<
571571
}
572572

573573
extension Collection {
574-
public func _copyToNativeArrayBuffer(
575-
) -> _ContiguousArrayBuffer<Iterator.Element> {
576-
return _copyCollectionToNativeArrayBuffer(self)
574+
public func _copyToContiguousArray() -> ContiguousArray<Iterator.Element> {
575+
return _copyCollectionToContiguousArray(self)
577576
}
578577
}
579578

580579
extension _ContiguousArrayBuffer {
581-
public func _copyToNativeArrayBuffer() -> _ContiguousArrayBuffer<Element> {
582-
return self
580+
public func _copyToContiguousArray() -> ContiguousArray<Element> {
581+
return ContiguousArray(_buffer: self)
583582
}
584583
}
585584

586-
/// This is a fast implementation of _copyToNativeArrayBuffer() for collections.
585+
/// This is a fast implementation of _copyToContiguousArray() for collections.
587586
///
588587
/// It avoids the extra retain, release overhead from storing the
589588
/// ContiguousArrayBuffer into
590589
/// _UnsafePartiallyInitializedContiguousArrayBuffer. Since we do not support
591590
/// ARC loops, the extra retain, release overhead cannot be eliminated which
592591
/// makes assigning ranges very slow. Once this has been implemented, this code
593592
/// should be changed to use _UnsafePartiallyInitializedContiguousArrayBuffer.
594-
internal func _copyCollectionToNativeArrayBuffer<
593+
internal func _copyCollectionToContiguousArray<
595594
C : Collection
596-
>(_ source: C) -> _ContiguousArrayBuffer<C.Iterator.Element>
595+
>(_ source: C) -> ContiguousArray<C.Iterator.Element>
597596
{
598597
let count: Int = numericCast(source.count)
599598
if count == 0 {
600-
return _ContiguousArrayBuffer()
599+
return ContiguousArray()
601600
}
602601

603602
let result = _ContiguousArrayBuffer<C.Iterator.Element>(
@@ -613,7 +612,7 @@ internal func _copyCollectionToNativeArrayBuffer<
613612
p += 1
614613
}
615614
_expectEnd(i, source)
616-
return result
615+
return ContiguousArray(_buffer: result)
617616
}
618617

619618
/// A "builder" interface for initializing array buffers.
@@ -678,7 +677,7 @@ internal struct _UnsafePartiallyInitializedContiguousArrayBuffer<Element> {
678677
/// Returns the fully-initialized buffer. `self` is reset to contain an
679678
/// empty buffer and cannot be used afterward.
680679
@inline(__always) // For performance reasons.
681-
mutating func finish() -> _ContiguousArrayBuffer<Element> {
680+
mutating func finish() -> ContiguousArray<Element> {
682681
// Adjust the initialized count of the buffer.
683682
result.count = result.capacity - remainingCapacity
684683

@@ -692,12 +691,12 @@ internal struct _UnsafePartiallyInitializedContiguousArrayBuffer<Element> {
692691
/// Returns the fully-initialized buffer. `self` is reset to contain an
693692
/// empty buffer and cannot be used afterward.
694693
@inline(__always) // For performance reasons.
695-
mutating func finishWithOriginalCount() -> _ContiguousArrayBuffer<Element> {
694+
mutating func finishWithOriginalCount() -> ContiguousArray<Element> {
696695
_sanityCheck(remainingCapacity == result.capacity - result.count,
697696
"_UnsafePartiallyInitializedContiguousArrayBuffer has incorrect count")
698697
var finalResult = _ContiguousArrayBuffer<Element>()
699698
swap(&finalResult, &result)
700699
remainingCapacity = 0
701-
return finalResult
700+
return ContiguousArray(_buffer: finalResult)
702701
}
703702
}

stdlib/public/core/ExistentialCollection.swift.gyb

+5-5
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ internal class _AnyRandomAccessCollectionBox<Element>
174174
_abstract()
175175
}
176176

177-
internal func __copyToNativeArrayBuffer() -> _ContiguousArrayStorageBase {
177+
internal func __copyToContiguousArray() -> ContiguousArray<Element> {
178178
_abstract()
179179
}
180180

@@ -358,8 +358,8 @@ internal final class _${Kind}Box<S : ${Kind}> : _Any${Kind}Box<S.Iterator.Elemen
358358
) rethrows -> R? {
359359
return try _base._preprocessingPass(preprocess)
360360
}
361-
internal override func __copyToNativeArrayBuffer() -> _ContiguousArrayStorageBase {
362-
return _base._copyToNativeArrayBuffer()._storage
361+
internal override func __copyToContiguousArray() -> ContiguousArray<Element> {
362+
return _base._copyToContiguousArray()
363363
}
364364
internal override func __copyContents(initializing ptr: UnsafeMutablePointer<Element>)
365365
-> UnsafeMutablePointer<Element> {
@@ -627,8 +627,8 @@ extension Any${Kind} {
627627
return try _box.__preprocessingPass(preprocess)
628628
}
629629

630-
public func _copyToNativeArrayBuffer() -> _ContiguousArrayBuffer<Element> {
631-
return _ContiguousArrayBuffer(self._box.__copyToNativeArrayBuffer())
630+
public func _copyToContiguousArray() -> ContiguousArray<Element> {
631+
return self._box.__copyToContiguousArray()
632632
}
633633

634634
public func _copyContents(initializing ptr: UnsafeMutablePointer<Element>)

stdlib/public/core/Flatten.swift.gyb

+4-4
Original file line numberDiff line numberDiff line change
@@ -336,14 +336,14 @@ public struct ${Collection}<Base> : ${collectionForTraversal(traversal)}
336336
// just return zero.
337337
public var underestimatedCount: Int { return 0 }
338338

339-
public func _copyToNativeArrayBuffer()
340-
-> _ContiguousArrayBuffer<Base.Iterator.Element.Iterator.Element> {
339+
public func _copyToContiguousArray()
340+
-> ContiguousArray<Base.Iterator.Element.Iterator.Element> {
341341

342-
// The default implementation of `_copyToNativeArrayBuffer` queries the
342+
// The default implementation of `_copyToContiguousArray` queries the
343343
// `count` property, which materializes every inner collection. This is a
344344
// bad default for `flatMap()`. So we treat `self` as a sequence and only
345345
// rely on underestimated count.
346-
return _copySequenceToNativeArrayBuffer(self)
346+
return _copySequenceToContiguousArray(self)
347347
}
348348

349349
// TODO: swift-3-indexing-model - add docs

stdlib/public/core/Join.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ public struct JoinedSequence<Base : Sequence> : Sequence
110110
separator: _separator)
111111
}
112112

113-
public func _copyToNativeArrayBuffer()
114-
-> _ContiguousArrayBuffer<Base.Iterator.Element.Iterator.Element> {
113+
public func _copyToContiguousArray()
114+
-> ContiguousArray<Base.Iterator.Element.Iterator.Element> {
115115
var result = ContiguousArray<Iterator.Element>()
116116
let separatorSize: Int = numericCast(_separator.count)
117117

@@ -132,7 +132,7 @@ public struct JoinedSequence<Base : Sequence> : Sequence
132132
for x in _base {
133133
result.append(contentsOf: x)
134134
}
135-
return result._buffer
135+
return result
136136
}
137137

138138
var iter = _base.makeIterator()
@@ -144,7 +144,7 @@ public struct JoinedSequence<Base : Sequence> : Sequence
144144
}
145145
}
146146

147-
return result._buffer
147+
return result
148148
}
149149

150150
internal var _base: Base

stdlib/public/core/LazyCollection.swift.gyb

+3-3
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ extension ${Self} : Sequence {
8989
/// - Complexity: O(N).
9090
public var underestimatedCount: Int { return _base.underestimatedCount }
9191

92-
public func _copyToNativeArrayBuffer()
93-
-> _ContiguousArrayBuffer<Base.Iterator.Element> {
94-
return _base._copyToNativeArrayBuffer()
92+
public func _copyToContiguousArray()
93+
-> ContiguousArray<Base.Iterator.Element> {
94+
return _base._copyToContiguousArray()
9595
}
9696

9797
@discardableResult

stdlib/public/core/Sequence.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ public protocol Sequence {
584584

585585
/// Create a native array buffer containing the elements of `self`,
586586
/// in the same order.
587-
func _copyToNativeArrayBuffer() -> _ContiguousArrayBuffer<Iterator.Element>
587+
func _copyToContiguousArray() -> ContiguousArray<Iterator.Element>
588588

589589
/// Copy a Sequence into an array, returning one past the last
590590
/// element initialized.

stdlib/public/core/SequenceWrapper.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,9 @@ extension Sequence
110110

111111
/// Create a native array buffer containing the elements of `self`,
112112
/// in the same order.
113-
public func _copyToNativeArrayBuffer()
114-
-> _ContiguousArrayBuffer<Base.Iterator.Element> {
115-
return _base._copyToNativeArrayBuffer()
113+
public func _copyToContiguousArray()
114+
-> ContiguousArray<Base.Iterator.Element> {
115+
return _base._copyToContiguousArray()
116116
}
117117

118118
/// Copy a Sequence into an array, returning one past the last

stdlib/public/core/SliceBuffer.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -327,11 +327,11 @@ struct _SliceBuffer<Element> : _ArrayBufferProtocol, RandomAccessCollection {
327327
}
328328

329329
extension _SliceBuffer {
330-
public func _copyToNativeArrayBuffer() -> _ContiguousArrayBuffer<Element> {
330+
public func _copyToContiguousArray() -> ContiguousArray<Element> {
331331
if _hasNativeBuffer {
332332
let n = nativeBuffer
333333
if count == n.count {
334-
return n
334+
return ContiguousArray(_buffer: n)
335335
}
336336
}
337337

@@ -340,6 +340,6 @@ extension _SliceBuffer {
340340
minimumCapacity: 0)
341341
result.firstElementAddress.initializeFrom(
342342
firstElementAddress, count: count)
343-
return result
343+
return ContiguousArray(_buffer: result)
344344
}
345345
}

validation-test/stdlib/Arrays.swift.gyb

+10-10
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,34 @@ import StdlibCollectionUnittest
66

77
let CopyToNativeArrayBufferTests = TestSuite("CopyToNativeArrayBufferTests")
88

9-
CopyToNativeArrayBufferTests.test("Sequence._copyToNativeArrayBuffer()") {
9+
CopyToNativeArrayBufferTests.test("Sequence._copyToContiguousArray()") {
1010
do {
1111
// Call from a static context.
1212
let s =
1313
MinimalSequence(elements: LifetimeTracked(10)..<LifetimeTracked(27))
1414

1515
expectEqual(0, s.timesMakeIteratorCalled.value)
16-
let buffer = s._copyToNativeArrayBuffer()
16+
let copy = s._copyToContiguousArray()
1717
expectEqual(1, s.timesMakeIteratorCalled.value)
1818
expectEqualSequence(
1919
Array(10..<27),
20-
buffer.map { $0.value })
20+
copy.map { $0.value })
2121
}
2222
do {
2323
// Call from a generic context.
2424
let wrapped = MinimalSequence(elements: LifetimeTracked(10)..<LifetimeTracked(27))
2525
let s = LoggingSequence(wrapping: wrapped)
2626

2727
expectEqual(0, wrapped.timesMakeIteratorCalled.value)
28-
let buffer = s._copyToNativeArrayBuffer()
28+
let copy = s._copyToContiguousArray()
2929
expectEqual(1, wrapped.timesMakeIteratorCalled.value)
3030
expectEqualSequence(
3131
Array(10..<27),
32-
buffer.map { $0.value })
32+
copy.map { $0.value })
3333
}
3434
}
3535

36-
CopyToNativeArrayBufferTests.test("Collection._copyToNativeArrayBuffer()") {
36+
CopyToNativeArrayBufferTests.test("Collection._copyToContiguousArray()") {
3737
// Check that collections are handled with the collection-specific API. This
3838
// means that we are calling the right default implementation (one for
3939
// collections, not the one for sequences).
@@ -45,12 +45,12 @@ CopyToNativeArrayBufferTests.test("Collection._copyToNativeArrayBuffer()") {
4545

4646
expectEqual(0, c.timesMakeIteratorCalled.value)
4747
expectEqual(0, c.timesStartIndexCalled.value)
48-
let buffer = c._copyToNativeArrayBuffer()
48+
let copy = c._copyToContiguousArray()
4949
expectEqual(0, c.timesMakeIteratorCalled.value)
5050
expectNotEqual(0, c.timesStartIndexCalled.value)
5151
expectEqualSequence(
5252
Array(10..<27),
53-
buffer.map { $0.value })
53+
copy.map { $0.value })
5454
}
5555
do {
5656
// Call from a generic context.
@@ -59,13 +59,13 @@ CopyToNativeArrayBufferTests.test("Collection._copyToNativeArrayBuffer()") {
5959
let s = LoggingSequence(wrapping: wrapped)
6060
expectEqual(0, wrapped.timesMakeIteratorCalled.value)
6161
expectEqual(0, wrapped.timesStartIndexCalled.value)
62-
let buffer = s._copyToNativeArrayBuffer()
62+
let copy = s._copyToContiguousArray()
6363
expectEqual(0, wrapped.timesMakeIteratorCalled.value)
6464
expectNotEqual(0, wrapped.timesStartIndexCalled.value)
6565

6666
expectEqualSequence(
6767
Array(10..<27),
68-
buffer.map { $0.value })
68+
copy.map { $0.value })
6969
}
7070
}
7171

0 commit comments

Comments
 (0)