1 /* 2 * Copyright 2021 Google Inc. All rights reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 import Foundation 18 19 extension Int { 20 21 /// Moves the current int into the nearest power of two 22 /// 23 /// This is used since the UnsafeMutableRawPointer will face issues when writing/reading 24 /// if the buffer alignment exceeds that actual size of the buffer 25 var convertToPowerofTwo: Int { 26 guard self > 0 else { return 1 } 27 var n = UOffset(self) 28 29 #if arch(arm) || arch(i386) 30 let max = UInt32(Int.max) 31 #else 32 let max = UInt32.max 33 #endif 34 35 n -= 1 36 n |= n >> 1 37 n |= n >> 2 38 n |= n >> 4 39 n |= n >> 8 40 n |= n >> 16 41 if n != max { 42 n += 1 43 } 44 45 return Int(n) 46 } 47 } 48