mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
De-genericize one axis of storage buffers to speed up compilation time of stdlib and user code. Publish the rest as ABI, since we're out of time to reevaluate the design.
62 lines
1.8 KiB
Swift
62 lines
1.8 KiB
Swift
//===--- UnicodeParser.swift ----------------------------------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
extension Unicode {
|
|
/// The result of attempting to parse a `T` from some input.
|
|
@_frozen
|
|
public enum ParseResult<T> {
|
|
/// A `T` was parsed successfully
|
|
case valid(T)
|
|
|
|
/// The input was entirely consumed.
|
|
case emptyInput
|
|
|
|
/// An encoding error was detected.
|
|
///
|
|
/// `length` is the number of underlying code units consumed by this
|
|
/// error, guaranteed to be greater than 0.
|
|
case error(length: Int)
|
|
|
|
@inlinable
|
|
internal var _valid: T? {
|
|
if case .valid(let result) = self { return result }
|
|
return nil
|
|
}
|
|
|
|
@inlinable
|
|
internal var _error: Int? {
|
|
if case .error(let result) = self { return result }
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Types that separate streams of code units into encoded Unicode
|
|
/// scalar values.
|
|
public protocol _UnicodeParser {
|
|
/// The encoding with which this parser is associated
|
|
associatedtype Encoding : _UnicodeEncoding
|
|
|
|
/// Constructs an instance that can be used to begin parsing `CodeUnit`s at
|
|
/// any Unicode scalar boundary.
|
|
init()
|
|
|
|
/// Parses a single Unicode scalar value from `input`.
|
|
mutating func parseScalar<I : IteratorProtocol>(
|
|
from input: inout I
|
|
) -> Unicode.ParseResult<Encoding.EncodedScalar>
|
|
where I.Element == Encoding.CodeUnit
|
|
}
|
|
|
|
extension Unicode {
|
|
public typealias Parser = _UnicodeParser
|
|
}
|