Files
swift-mirror/stdlib/public/Concurrency/Deque/_DequeSlot.swift
Franz Busch 8dda2274bc Replace custom Deque implementation with swift-collection Deque
# Motivation
For AsyncStream we created a custom internal Deque implementation to use for the buffering. This implementation was relatively bare-bones compared to the one in swift-collections. Furthermore, it lacked some methods that we need to implement the new `AsyncStream` APIs that support producer backpressure.

# Modification
This PR copies over the Deque implementation of swift-collections and makes it internal and non-inlinable.

# Result
We now have a fully functional Deque.
2023-07-23 08:33:03 +01:00

60 lines
1.5 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2021 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
//
//===----------------------------------------------------------------------===//
/// This file is copied from swift-collections and should not be modified here.
/// Rather all changes should be made to swift-collections and copied back.
import Swift
internal struct _DequeSlot {
internal var position: Int
init(at position: Int) {
assert(position >= 0)
self.position = position
}
}
extension _DequeSlot {
internal static var zero: Self { Self(at: 0) }
internal func advanced(by delta: Int) -> Self {
Self(at: position &+ delta)
}
internal func orIfZero(_ value: Int) -> Self {
guard position > 0 else { return Self(at: value) }
return self
}
}
extension _DequeSlot: CustomStringConvertible {
internal var description: String {
"@\(position)"
}
}
extension _DequeSlot: Equatable {
static func ==(left: Self, right: Self) -> Bool {
left.position == right.position
}
}
extension _DequeSlot: Comparable {
static func <(left: Self, right: Self) -> Bool {
left.position < right.position
}
}
extension Range where Bound == _DequeSlot {
internal var _count: Int { upperBound.position - lowerBound.position }
}