-
Notifications
You must be signed in to change notification settings - Fork 15
/
Storage.swift
65 lines (53 loc) · 2.35 KB
/
Storage.swift
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
import Foundation
extension Array where Element:SignedNumeric {
public init(_ count:Int) { self.init(repeating:0, count:count) }
public func copy() -> Array {
var a = (self as NSCopying).copy(with: nil) as! Array
// HACK: force a copy. Must be a better way...
a[0] = a[0]
return a
}
public var p:UnsafeMutablePointer<Element> {get {return UnsafeMutablePointer(mutating: self)}}
}
extension Array: BaseVector where Element:SignedNumeric { }
extension Array: FloatVector where Element:SupportsBasicMath { }
public protocol ComposedStorage {
associatedtype Storage:MutableCollection,CustomStringConvertible where Storage.Index==Int
typealias Index=Int
var data:Storage {get set}
var endIndex:Int {get}
subscript(i:Int)->Storage.Element {get set}
}
public extension ComposedStorage {
subscript(i:Int)->Storage.Element { get {return data[i]} set {data[i] = newValue} }
var endIndex: Int { return data.count }
}
extension UnsafeMutableBufferPointer {
public init(_ count:Int) {
let sz = MemoryLayout<Element>.stride
let raw = UnsafeMutableRawBufferPointer.allocate(byteCount: sz*count, alignment: 64)
self.init(rebasing: raw.bindMemory(to: Element.self)[0...])
}
public init(_ array:Array<Element>) {
self.init(array.count)
_ = initialize(from:array)
}
public var p:UnsafeMutablePointer<Element> {get {return baseAddress!}}
public func copy()->UnsafeMutableBufferPointer { return .init(Array(self)) }
}
extension UnsafeMutableBufferPointer: BaseVector,ExpressibleByArrayLiteral,Equatable,CustomStringConvertible
where Element:SignedNumeric {
public typealias ArrayLiteralElement=Element
}
extension UnsafeMutableBufferPointer: FloatVector where Element:SupportsBasicMath { }
public final class AlignedStorage<T:SignedNumeric>: BaseVector,ComposedStorage {
public typealias Element=T
public var data:UnsafeMutableBufferPointer<T>
public init(_ data: UnsafeMutableBufferPointer<T>) {self.data=data}
public convenience init(_ count:Int) { self.init(UnsafeMutableBufferPointer(count)) }
public convenience init(_ array:Array<T>) { self.init(UnsafeMutableBufferPointer(array)) }
deinit { UnsafeMutableRawBufferPointer(data).deallocate() }
public var p:MutPtrT {get {return data.p}}
public func copy()->Self { return .init(data.copy()) }
}
extension AlignedStorage:FloatVector where T:SupportsBasicMath {}