mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
* De-underscore @frozen for enums * Add @frozen for structs, deprecate @_fixed_layout for them * Switch usage from _fixed_layout to frozen
96 lines
2.8 KiB
Swift
96 lines
2.8 KiB
Swift
//===--- ArrayBody.swift - Data needed once per array ---------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Array storage begins with a Body and ends with a sequence of
|
|
// contiguous Elements. This struct describes the Body part.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
import SwiftShims
|
|
|
|
@frozen
|
|
@usableFromInline
|
|
internal struct _ArrayBody {
|
|
@usableFromInline
|
|
internal var _storage: _SwiftArrayBodyStorage
|
|
|
|
@inlinable
|
|
internal init(
|
|
count: Int, capacity: Int, elementTypeIsBridgedVerbatim: Bool = false
|
|
) {
|
|
_internalInvariant(count >= 0)
|
|
_internalInvariant(capacity >= 0)
|
|
|
|
_storage = _SwiftArrayBodyStorage(
|
|
count: count,
|
|
_capacityAndFlags:
|
|
(UInt(truncatingIfNeeded: capacity) &<< 1) |
|
|
(elementTypeIsBridgedVerbatim ? 1 : 0))
|
|
}
|
|
|
|
/// In principle ArrayBody shouldn't need to be default
|
|
/// constructed, but since we want to claim all the allocated
|
|
/// capacity after a new buffer is allocated, it's typical to want
|
|
/// to update it immediately after construction.
|
|
@inlinable
|
|
internal init() {
|
|
_storage = _SwiftArrayBodyStorage(count: 0, _capacityAndFlags: 0)
|
|
}
|
|
|
|
/// The number of elements stored in this Array.
|
|
@inlinable
|
|
internal var count: Int {
|
|
get {
|
|
return _assumeNonNegative(_storage.count)
|
|
}
|
|
set(newCount) {
|
|
_storage.count = newCount
|
|
}
|
|
}
|
|
|
|
/// The number of elements that can be stored in this Array without
|
|
/// reallocation.
|
|
@inlinable
|
|
internal var capacity: Int {
|
|
return Int(_capacityAndFlags &>> 1)
|
|
}
|
|
|
|
/// Is the Element type bitwise-compatible with some Objective-C
|
|
/// class? The answer is---in principle---statically-knowable, but
|
|
/// I don't expect to be able to get this information to the
|
|
/// optimizer before 1.0 ships, so we store it in a bit here to
|
|
/// avoid the cost of calls into the runtime that compute the
|
|
/// answer.
|
|
@inlinable
|
|
internal var elementTypeIsBridgedVerbatim: Bool {
|
|
get {
|
|
return (_capacityAndFlags & 0x1) != 0
|
|
}
|
|
set {
|
|
_capacityAndFlags
|
|
= newValue ? _capacityAndFlags | 1 : _capacityAndFlags & ~1
|
|
}
|
|
}
|
|
|
|
/// Storage optimization: compresses capacity and
|
|
/// elementTypeIsBridgedVerbatim together.
|
|
@inlinable
|
|
internal var _capacityAndFlags: UInt {
|
|
get {
|
|
return _storage._capacityAndFlags
|
|
}
|
|
set {
|
|
_storage._capacityAndFlags = newValue
|
|
}
|
|
}
|
|
}
|