Added `log2InPlace` to ‘Logarithm.swift’ & made `log2` into thin wrapper

This commit is contained in:
Vincent Esche 2019-09-24 18:01:35 +02:00
parent 048d343e7e
commit a85b50231b
1 changed files with 26 additions and 16 deletions

View File

@ -59,26 +59,36 @@ func logInPlace<L: UnsafeMutableMemoryAccessible>(_ lhs: inout L) where L.Elemen
// MARK: - Base-2 Logarithm // MARK: - Base-2 Logarithm
/// - Warning: does not support memory stride (assumes stride is 1). /// - Warning: does not support memory stride (assumes stride is 1).
public func log2<X: UnsafeMemoryAccessible>(_ x: X) -> [Float] where X.Element == Float { public func log2<L: UnsafeMemoryAccessible>(_ lhs: L) -> [Float] where L.Element == Float {
return x.withUnsafeMemory { xm in var results = Array(lhs)
precondition(xm.stride == 1, "\(#function) does not support strided memory access") log2InPlace(&results)
var results = [Float](x)
results.withUnsafeMutableBufferPointer { rbp in
vvlog2f(rbp.baseAddress!, xm.pointer, [numericCast(xm.count)])
}
return results return results
}
/// - Warning: does not support memory stride (assumes stride is 1).
public func log2<L: UnsafeMemoryAccessible>(_ lhs: L) -> [Double] where L.Element == Double {
var results = Array(lhs)
log2InPlace(&results)
return results
}
// MARK: - Base-2 Logarithm: In Place
/// - Warning: does not support memory stride (assumes stride is 1).
func log2InPlace<L: UnsafeMutableMemoryAccessible>(_ lhs: inout L) where L.Element == Float {
withUnsafeMutableMemory(&lhs) { lm in
precondition(lm.stride == 1, "\(#function) does not support strided memory access")
var elementCount: Int32 = numericCast(lm.count)
vvlog2f(lm.pointer, lm.pointer, &elementCount)
} }
} }
/// - Warning: does not support memory stride (assumes stride is 1). /// - Warning: does not support memory stride (assumes stride is 1).
public func log2<X: UnsafeMemoryAccessible>(_ x: X) -> [Double] where X.Element == Double { func log2InPlace<L: UnsafeMutableMemoryAccessible>(_ lhs: inout L) where L.Element == Double {
return x.withUnsafeMemory { xm in withUnsafeMutableMemory(&lhs) { lm in
precondition(xm.stride == 1, "\(#function) does not support strided memory access") precondition(lm.stride == 1, "\(#function) does not support strided memory access")
var results = [Double](x) var elementCount: Int32 = numericCast(lm.count)
results.withUnsafeMutableBufferPointer { rbp in vvlog2(lm.pointer, lm.pointer, &elementCount)
vvlog2(rbp.baseAddress!, xm.pointer, [numericCast(xm.count)])
}
return results
} }
} }