Files
swift-mirror/stdlib/core/CocoaArray.swift
Dave Abrahams d00e888d95 [stdlib] Rename reinterpretCast => unsafeBitCast
Also give unsafeBitCast an explicit type parameter.  So

  let x: T = reinterpretCast(y)

becomes

  let x = unsafeBitCast(y, T.self)

Swift SVN r20487
2014-07-24 13:17:36 +00:00

101 lines
3.5 KiB
Swift

//===--- CocoaArray.swift - A subset of the NSArray interface -------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// To implement bridging, the core standard library needs to interact
// a little bit with Cocoa. Because we want to keep the core
// decoupled from the Foundation module, we can't use NSArray
// directly. We _can_, however, use an @objc protocol with a
// compatible API. That's _CocoaArrayType.
//
//===----------------------------------------------------------------------===//
import SwiftShims
/// A subset of the NSArray interface with call-compatible selectors
/// (e.g. _SwiftNSRange is layout-compatible with NSRange in
/// getObjects:range: below). Array<T> is backed by one of these, and
/// when _isBridgedToObjectiveC(T.self), it can be used directly as an
/// NSArray. It is safe to convert between NSArray and _CocoaArrayType via
/// unsafeBitCast.
@unsafe_no_objc_tagged_pointer @objc
public protocol _CocoaArrayType {
func objectAtIndex(index: Int) -> AnyObject
func getObjects(UnsafeMutablePointer<AnyObject>, range: _SwiftNSRange)
func countByEnumeratingWithState(
state: UnsafeMutablePointer<_SwiftNSFastEnumerationState>,
objects buffer: UnsafeMutablePointer<AnyObject>,
count len: Int) -> Int
func copyWithZone(COpaquePointer) -> _CocoaArrayType
var count: Int {get}
}
/// A wrapper around any _CocoaArrayType that gives it CollectionType
/// conformance. Why not make _CocoaArrayType conform directly? It's a
/// class, and I don't want to pay for the dynamic dispatch overhead.
internal struct _CocoaArrayWrapper : CollectionType {
var startIndex: Int {
return 0
}
var endIndex: Int {
return buffer.count
}
subscript(i: Int) -> AnyObject {
return buffer.objectAtIndex(i)
}
func generate() -> IndexingGenerator<_CocoaArrayWrapper> {
return IndexingGenerator(self)
}
/// Returns a pointer to the first element in the given subRange if
/// the subRange is stored contiguously. Otherwise, return nil.
///
/// Note: this method should only be used as an optimization; it
/// is sometimes conservative and may return nil even when
/// contiguous storage exists, e.g., if array doesn't have a smart
/// implementation of countByEnumeratingWithState.
func contiguousStorage(
subRange: Range<Int>
) -> UnsafeMutablePointer<AnyObject>
{
var enumerationState = _makeSwiftNSFastEnumerationState()
// This function currently returns nil unless the first
// subRange.endIndex items are stored contiguously. This is an
// acceptable conservative behavior, but could potentially be
// optimized for other cases.
let contiguousCount = withUnsafeMutablePointer(&enumerationState) {
self.buffer.countByEnumeratingWithState($0, objects: nil, count: 0)
}
return contiguousCount >= subRange.endIndex
? unsafeBitCast(
enumerationState.itemsPtr, UnsafeMutablePointer<AnyObject>.self
) + subRange.startIndex
: nil
}
@transparent
init(_ buffer: _CocoaArrayType) {
self.buffer = buffer
}
var buffer: _CocoaArrayType
}