@@ -295,33 +295,20 @@ extension SequenceType {
295
295
@noescape transform: ( Generator . Element ) throws -> T
296
296
) rethrows -> [ T ] {
297
297
let initialCapacity = underestimateCount ( )
298
- var builder =
299
- _UnsafePartiallyInitializedContiguousArrayBuffer < T > (
300
- initialCapacity: initialCapacity)
298
+ var builder = ContiguousArray < T > ( )
299
+ builder. reserveCapacity ( initialCapacity)
301
300
302
301
var generator = generate ( )
303
302
304
- // FIXME: Type checker doesn't allow a `rethrows` function to catch and
305
- // throw an error. It'd be nice to separate the success and failure cleanup
306
- // paths more cleanly than this.
307
- // Ensure the buffer is left in a destructible state.
308
- var finished = false
309
- defer {
310
- if !finished {
311
- _ = builder. finish ( )
312
- }
313
- }
314
303
// Add elements up to the initial capacity without checking for regrowth.
315
304
for _ in 0 ..< initialCapacity {
316
- builder. addWithExistingCapacity ( try transform ( generator. next ( ) !) )
305
+ builder. append ( try transform ( generator. next ( ) !) )
317
306
}
318
307
// Add remaining elements, if any.
319
308
while let element = generator. next ( ) {
320
- builder. add ( try transform ( element) )
309
+ builder. append ( try transform ( element) )
321
310
}
322
- let buffer = builder. finish ( )
323
- finished = true
324
- return Array ( buffer)
311
+ return Array ( builder)
325
312
}
326
313
327
314
/// Return an `Array` containing the elements of `self`,
@@ -330,30 +317,18 @@ extension SequenceType {
330
317
public func filter(
331
318
@noescape includeElement: ( Generator . Element ) throws -> Bool
332
319
) rethrows -> [ Generator . Element ] {
333
- var builder =
334
- _UnsafePartiallyInitializedContiguousArrayBuffer < Generator . Element > (
335
- initialCapacity: 0 )
320
+
321
+ var builder = ContiguousArray < Generator . Element > ( )
336
322
337
323
var generator = generate ( )
338
324
339
- // FIXME: Type checker doesn't allow a `rethrows` function to catch and
340
- // throw an error. It'd be nice to separate the success and failure cleanup
341
- // paths more cleanly than this.
342
- // Ensure the buffer is left in a destructible state.
343
- var finished = false
344
- defer {
345
- if !finished {
346
- _ = builder. finish ( )
347
- }
348
- }
349
325
while let element = generator. next ( ) {
350
326
if try includeElement ( element) {
351
- builder. add ( element)
327
+ builder. append ( element)
352
328
}
353
329
}
354
- let buffer = builder. finish ( )
355
- finished = true
356
- return Array ( buffer)
330
+
331
+ return Array ( builder)
357
332
}
358
333
359
334
/// Returns a subsequence containing all but the first `n` elements.
0 commit comments