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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
@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
}
}
|