// NibbleSort benchmark // // Source: https://gist.github.com/airspeedswift/f4daff4ea5c6de9e1fdf import TestsUtils public var NibbleSort = BenchmarkInfo( name: "NibbleSort", runFunction: run_NibbleSort, tags: [.validation] ) @inline(never) public func run_NibbleSort(_ N: Int) { let vRef: UInt64 = 0xfeedbba000000000 let v: UInt64 = 0xbadbeef var c = NibbleCollection(v) for _ in 1...10000*N { c.val = v c.sort() if c.val != vRef { break } } CheckResults(c.val == vRef) } struct NibbleCollection: RandomAccessCollection, MutableCollection { typealias Indices = CountableRange var val: UInt64 init(_ val: UInt64) { self.val = val } typealias Index = UInt64 let startIndex: UInt64 = 0 let endIndex: UInt64 = 16 subscript(bounds: Range) -> Slice { get { fatalError("Should not be called. Added here to please the type checker") } set { fatalError("Should not be called. Added here to please the type checker") } } subscript(idx: UInt64) -> UInt64 { get { return (val >> (idx*4)) & 0xf } set(n) { let mask = (0xf as UInt64) << (idx * 4) val &= ~mask val |= n << (idx * 4) } } typealias Iterator = IndexingIterator func makeIterator() -> Iterator { return Iterator(_elements: self) } }