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 83 84 85 86 87 88 89
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift Collections open source project
//
// Copyright (c) 2022 - 2024 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
//
//===----------------------------------------------------------------------===//
%{
from gyb_utils import *
}%
${autogenerated_warning()}
% for modifier in visibility_levels:
${visibility_boilerplate(modifier)}
#if compiler(<5.7) || (os(macOS) && compiler(<5.8)) // SE-0334
extension UnsafeRawPointer {
/// Obtain the next pointer properly aligned to store a value of type `T`.
///
/// If `self` is properly aligned for accessing `T`,
/// this function returns `self`.
///
/// - Parameters:
/// - type: the type to be stored at the returned address.
/// - Returns: a pointer properly aligned to store a value of type `T`.
@inlinable
@_alwaysEmitIntoClient
${modifier} func alignedUp<T>(for type: T.Type) -> Self {
let mask = UInt(MemoryLayout<T>.alignment) &- 1
let bits = (UInt(bitPattern: self) &+ mask) & ~mask
return Self(bitPattern: bits)!
}
/// Obtain the preceding pointer properly aligned to store a value of type `T`.
///
/// If `self` is properly aligned for accessing `T`,
/// this function returns `self`.
///
/// - Parameters:
/// - type: the type to be stored at the returned address.
/// - Returns: a pointer properly aligned to store a value of type `T`.
@inlinable
@_alwaysEmitIntoClient
${modifier} func alignedDown<T>(for type: T.Type) -> Self {
let mask = UInt(MemoryLayout<T>.alignment) &- 1
let bits = UInt(bitPattern: self) & ~mask
return Self(bitPattern: bits)!
}
}
extension UnsafeMutableRawPointer {
/// Obtain the next pointer properly aligned to store a value of type `T`.
///
/// If `self` is properly aligned for accessing `T`,
/// this function returns `self`.
///
/// - Parameters:
/// - type: the type to be stored at the returned address.
/// - Returns: a pointer properly aligned to store a value of type `T`.
@inlinable
@_alwaysEmitIntoClient
${modifier} func alignedUp<T>(for type: T.Type) -> Self {
let mask = UInt(MemoryLayout<T>.alignment) &- 1
let bits = (UInt(bitPattern: self) &+ mask) & ~mask
return Self(bitPattern: bits)!
}
/// Obtain the preceding pointer properly aligned to store a value of type `T`.
///
/// If `self` is properly aligned for accessing `T`,
/// this function returns `self`.
///
/// - Parameters:
/// - type: the type to be stored at the returned address.
/// - Returns: a pointer properly aligned to store a value of type `T`.
@inlinable
@_alwaysEmitIntoClient
${modifier} func alignedDown<T>(for type: T.Type) -> Self {
let mask = UInt(MemoryLayout<T>.alignment) &- 1
let bits = UInt(bitPattern: self) & ~mask
return Self(bitPattern: bits)!
}
}
#endif
% end
${visibility_boilerplate("end")}
|