| //===----------------------------------------------------------------------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // Declarations to enable ease-of-testing |
| |
| public // @testable |
| struct _StringRepresentation { |
| public var _isASCII: Bool |
| public var _count: Int |
| public var _capacity: Int |
| |
| public enum _Form { |
| case _small |
| case _cocoa(object: AnyObject) |
| case _native(object: AnyObject) |
| case _immortal(address: UInt) |
| // TODO: shared native |
| } |
| public var _form: _Form |
| |
| public var _objectIdentifier: ObjectIdentifier? { |
| switch _form { |
| case ._cocoa(let object): return ObjectIdentifier(object) |
| case ._native(let object): return ObjectIdentifier(object) |
| default: return nil |
| } |
| } |
| } |
| |
| extension String { |
| public // @testable |
| func _classify() -> _StringRepresentation { return _guts._classify() } |
| } |
| |
| extension _StringGuts { |
| internal func _classify() -> _StringRepresentation { |
| var result = _StringRepresentation( |
| _isASCII: self.isASCII, |
| _count: self.count, |
| _capacity: nativeCapacity ?? 0, |
| _form: ._small |
| ) |
| if self.isSmall { |
| result._capacity = _SmallString.capacity |
| return result |
| } |
| if _object.largeIsCocoa { |
| result._form = ._cocoa(object: _object.cocoaObject) |
| return result |
| } |
| |
| // TODO: shared native |
| _internalInvariant(_object.providesFastUTF8) |
| if _object.isImmortal { |
| result._form = ._immortal( |
| address: UInt(bitPattern: _object.nativeUTF8Start)) |
| return result |
| } |
| if _object.hasNativeStorage { |
| _internalInvariant(_object.largeFastIsTailAllocated) |
| result._form = ._native(object: _object.nativeStorage) |
| return result |
| } |
| fatalError() |
| } |
| } |
| |