mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
In answering a forum post I noiced that I wanted this and it was missing. Also, extensive comments Also, rename the length: init parameter to count:. When writing the comments for the init function it became painfully clear why we use "count" is better than "length" especially around pointers and memory: the former is much less easy to mistake for "length in bytes". Plus it's consistent with the new ".count" property Swift SVN r20609
95 lines
2.7 KiB
Swift
95 lines
2.7 KiB
Swift
//===--- UnsafeBufferPointer.swift.gyb ------------------------*- swift -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// A generator for the elements in the buffer referenced by
|
|
/// `UnsafeBufferPointer` or `UnsafeMutableBufferPointer`
|
|
public struct UnsafeBufferPointerGenerator<T>: GeneratorType, SequenceType {
|
|
public mutating func next() -> T? {
|
|
return position == end ? nil : (position++).memory
|
|
}
|
|
|
|
public func generate() -> UnsafeBufferPointerGenerator {
|
|
return self
|
|
}
|
|
|
|
var position, end: UnsafePointer<T>
|
|
}
|
|
|
|
%for Mutable in ('Mutable', ''):
|
|
/// A non-owning pointer to buffer of ${Mutable.lower()} `T`\ s stored
|
|
/// contiguously in memory, presenting a `Collection` interface to the
|
|
/// underlying elements.
|
|
public struct Unsafe${Mutable}BufferPointer<T> : ${Mutable}CollectionType {
|
|
|
|
public var startIndex: Int {
|
|
return 0
|
|
}
|
|
|
|
public var endIndex: Int {
|
|
return _end - _position
|
|
}
|
|
|
|
/// Access the `i`\ th element in the buffer.
|
|
public subscript(i: Int) -> T {
|
|
get {
|
|
_debugPrecondition(i >= 0)
|
|
_debugPrecondition(i < endIndex)
|
|
return _position[i]
|
|
}
|
|
%if Mutable:
|
|
nonmutating set {
|
|
_debugPrecondition(i >= 0)
|
|
_debugPrecondition(i < endIndex)
|
|
_position[i] = newValue
|
|
}
|
|
%end
|
|
}
|
|
|
|
/// Construct an Unsafe${Mutable}Pointer over the `count` contiguous
|
|
/// `T` instances beginning at `start`.
|
|
public init(start: Unsafe${Mutable}Pointer<T>, count: Int) {
|
|
_precondition(
|
|
count >= 0, "Unsafe${Mutable}BufferPointer with negative count")
|
|
_position = start
|
|
_end = start + count
|
|
}
|
|
|
|
/// Return a generator over the buffer's elements
|
|
public func generate() -> UnsafeBufferPointerGenerator<T> {
|
|
return UnsafeBufferPointerGenerator(position: _position, end: _end)
|
|
}
|
|
|
|
/// A pointer to the first element of the buffer
|
|
public var baseAddress: Unsafe${Mutable}Pointer<T> {
|
|
return _position
|
|
}
|
|
|
|
/// The number of elements in the buffer
|
|
public var count: Int {
|
|
return _end - _position
|
|
}
|
|
|
|
var _position, _end: Unsafe${Mutable}Pointer<T>
|
|
}
|
|
|
|
extension Unsafe${Mutable}BufferPointer : DebugPrintable {
|
|
public var debugDescription: String {
|
|
return "Unsafe${Mutable}BufferPointer"
|
|
+ "(start: \(_position), length: \(_end - _position))"
|
|
}
|
|
}
|
|
%end
|
|
|
|
// ${'Local Variables'}:
|
|
// eval: (read-only-mode 1)
|
|
// End:
|