//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// /// A type that can represent a string as a collection of characters. /// /// Do not declare new conformances to `StringProtocol`. Only the `String` and /// `Substring` types in the standard library are valid conforming types. public protocol StringProtocol : BidirectionalCollection, TextOutputStream, TextOutputStreamable, LosslessStringConvertible, ExpressibleByStringLiteral, Hashable, Comparable where Iterator.Element == Character, SubSequence : StringProtocol { associatedtype UTF8View : /*Bidirectional*/Collection where UTF8View.Element == UInt8 // Unicode.UTF8.CodeUnit associatedtype UTF16View : BidirectionalCollection where UTF16View.Element == UInt16 // Unicode.UTF16.CodeUnit associatedtype UnicodeScalarView : BidirectionalCollection where UnicodeScalarView.Element == Unicode.Scalar associatedtype SubSequence = Substring var utf8: UTF8View { get } var utf16: UTF16View { get } var unicodeScalars: UnicodeScalarView { get } func hasPrefix(_ prefix: String) -> Bool func hasSuffix(_ prefix: String) -> Bool func lowercased() -> String func uppercased() -> String /// Creates a string from the given Unicode code units in the specified /// encoding. /// /// - Parameters: /// - codeUnits: A collection of code units encoded in the encoding /// specified in `sourceEncoding`. /// - sourceEncoding: The encoding in which `codeUnits` should be /// interpreted. init( decoding codeUnits: C, as sourceEncoding: Encoding.Type ) where C.Iterator.Element == Encoding.CodeUnit /// Creates a string from the null-terminated, UTF-8 encoded sequence of /// bytes at the given pointer. /// /// - Parameter nullTerminatedUTF8: A pointer to a sequence of contiguous, /// UTF-8 encoded bytes ending just before the first zero byte. init(cString nullTerminatedUTF8: UnsafePointer) /// Creates a string from the null-terminated sequence of bytes at the given /// pointer. /// /// - Parameters: /// - nullTerminatedCodeUnits: A pointer to a sequence of contiguous code /// units in the encoding specified in `sourceEncoding`, ending just /// before the first zero code unit. /// - sourceEncoding: The encoding in which the code units should be /// interpreted. init( decodingCString nullTerminatedCodeUnits: UnsafePointer, as sourceEncoding: Encoding.Type) /// Calls the given closure with a pointer to the contents of the string, /// represented as a null-terminated sequence of UTF-8 code units. /// /// The pointer passed as an argument to `body` is valid only during the /// execution of `withCString(_:)`. Do not store or return the pointer for /// later use. /// /// - Parameter body: A closure with a pointer parameter that points to a /// null-terminated sequence of UTF-8 code units. If `body` has a return /// value, that value is also used as the return value for the /// `withCString(_:)` method. The pointer argument is valid only for the /// duration of the method's execution. /// - Returns: The return value, if any, of the `body` closure parameter. func withCString( _ body: (UnsafePointer) throws -> Result) rethrows -> Result /// Calls the given closure with a pointer to the contents of the string, /// represented as a null-terminated sequence of code units. /// /// The pointer passed as an argument to `body` is valid only during the /// execution of `withCString(encodedAs:_:)`. Do not store or return the /// pointer for later use. /// /// - Parameters: /// - body: A closure with a pointer parameter that points to a /// null-terminated sequence of code units. If `body` has a return /// value, that value is also used as the return value for the /// `withCString(encodedAs:_:)` method. The pointer argument is valid /// only for the duration of the method's execution. /// - targetEncoding: The encoding in which the code units should be /// interpreted. /// - Returns: The return value, if any, of the `body` closure parameter. func withCString( encodedAs targetEncoding: Encoding.Type, _ body: (UnsafePointer) throws -> Result ) rethrows -> Result /// The entire String onto whose slice this view is a projection. var _wholeString : String { get } /// The range of storage offsets of this view in `_wholeString`. var _encodedOffsetRange : Range { get } } extension StringProtocol { public var _wholeString: String { return String(self) } public var _encodedOffsetRange: Range { return 0 ..< numericCast(self.utf16.count) } } /// A protocol that provides fast access to a known representation of String. /// /// Can be used to specialize generic functions that would otherwise end up /// doing grapheme breaking to vend individual characters. @usableFromInline // FIXME(sil-serialize-all) internal protocol _SwiftStringView { /// A `String`, having the same contents as `self`, that may be unsuitable for /// long-term storage. var _ephemeralContent : String { get } /// A `String`, having the same contents as `self`, that is suitable for /// long-term storage. // // FIXME: Remove once _StringGuts has append(contentsOf:). var _persistentContent : String { get } /// The entire String onto whose slice this view is a projection. var _wholeString : String { get } /// The range of storage offsets of this view in `_wholeString`. var _encodedOffsetRange : Range { get } } extension _SwiftStringView { @inlinable // FIXME(sil-serialize-all) internal var _ephemeralContent : String { return _persistentContent } } extension StringProtocol { @inlinable // FIXME(sil-serialize-all) public // Used in the Foundation overlay var _ephemeralString : String { if _fastPath(self is _SwiftStringView) { return (self as! _SwiftStringView)._ephemeralContent } return String(self) } } extension String : _SwiftStringView { @inlinable // FIXME(sil-serialize-all) internal var _persistentContent : String { return self } @inlinable // FIXME(sil-serialize-all) public var _wholeString : String { return self } @inlinable // FIXME(sil-serialize-all) public var _encodedOffsetRange : Range { return 0..<_guts.count } }