1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2023 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 String {
static func _tryFromUTF8(_ input: BufferView<UInt8>) -> String? {
input.withUnsafePointer { pointer, capacity in
_tryFromUTF8(.init(start: pointer, count: capacity))
}
}
}
extension Data {
init(bufferView: BufferView<UInt8>) {
self = bufferView.withUnsafeBufferPointer {
Data(buffer: $0)
}
}
func withBufferView<ResultType>(
_ body: (BufferView<UInt8>) throws -> ResultType
) rethrows -> ResultType {
try withUnsafeBytes {
// Data never passes an empty buffer with a `nil` `baseAddress`.
try body(BufferView(unsafeRawBufferPointer: $0)!)
}
}
}
extension BufferView<UInt8> {
internal func slice(from startOffset: Int, count sliceCount: Int) -> BufferView {
precondition(
startOffset >= 0 && startOffset < count && sliceCount >= 0
&& sliceCount <= count && startOffset &+ sliceCount <= count
)
return uncheckedSlice(from: startOffset, count: sliceCount)
}
internal func uncheckedSlice(from startOffset: Int, count sliceCount: Int) -> BufferView {
let address = startIndex.advanced(by: startOffset)
return BufferView(start: address, count: sliceCount)
}
internal subscript(region: JSONMap.Region) -> BufferView {
slice(from: region.startOffset, count: region.count)
}
internal subscript(unchecked region: JSONMap.Region) -> BufferView {
uncheckedSlice(from: region.startOffset, count: region.count)
}
}
|