Files
swift-mirror/benchmark/utils/SimpleArray.swift
Dario Rexin 210c68d8aa [SILOptimizer] Add prespecialization for arbitray reference types (#58846)
* [SILOptimizer] Add prespecialization for arbitray reference types

* Fix benchmark Package.swift

* Move SimpleArray to utils

* Fix multiple indirect result case

* Remove leftover code from previous attempt

* Fix test after rebase

* Move code to compute type replacements to SpecializedFunction

* Fix ownership when OSSA is enabled

* Fixes after rebase

* Changes after rebasing

* Add feature flag for layout pre-specialization

* Fix pre_specialize-macos.swift

* Add compiler flag to benchmark build

* Fix benchmark SwiftPM flags
2022-09-22 16:29:01 -07:00

82 lines
1.8 KiB
Swift

@usableFromInline
@frozen
struct Header {
@usableFromInline
let capacity: Int
@usableFromInline
var count: Int
}
public final class SimpleArray<T> {
@usableFromInline let storage: ManagedBuffer<Header, T>
@_alwaysEmitIntoClient
@inline(__always)
@inlinable
var count: Int {
get {
return self.storage.withUnsafeMutablePointerToHeader { return $0.pointee.count }
}
set {
return self.storage.withUnsafeMutablePointerToHeader { $0.pointee.count = newValue }
}
}
@_alwaysEmitIntoClient
@inline(__always)
@inlinable
var capacity: Int {
return self.storage.withUnsafeMutablePointerToHeader { return $0.pointee.capacity }
}
public init(capacity: Int) {
self.storage = .create(minimumCapacity: capacity) { _ in
return Header(capacity: capacity, count: 0)
}
}
@_alwaysEmitIntoClient
@inline(__always)
@inlinable
func append_internal(_ element: __owned T) {
guard count < capacity else {
fatalError("Array is full")
}
storage.withUnsafeMutablePointerToElements { ($0 + count).initialize(to: element) }
count += 1
}
@inline(never)
@_effects(notEscaping self.**)
@_specialize(exported: true, where @_noMetadata T : _Class)
public func append(_ element: __owned T) {
append_internal(element)
}
@inline(never)
@inlinable
@_effects(notEscaping self.**)
public func append2(_ element: __owned T) {
append_internal(element)
}
@inline(__always)
@inlinable
@_effects(notEscaping self.**)
public func append3(_ element: __owned T) {
append_internal(element)
}
@inline(never)
@_effects(notEscaping self.**)
public func append4(_ element: __owned T) {
append_internal(element)
}
public func clear() {
// only reset the count to avoid measuring deinitialization
// overhead in benchmark
self.count = 0
}
}