// // DataWithPointer.swift // SWCompression // // Created by Timofey Solomko on 01.11.16. // Copyright © 2016 Timofey Solomko. All rights reserved. // import Foundation enum BitOrder { case straight case reversed } class DataWithPointer { private let bitOrder: BitOrder private let bitArray: [UInt8] var index: Int = 0 private(set) var bitMask: UInt8 init(data: Data, bitOrder: BitOrder) { self.bitOrder = bitOrder self.bitArray = data.toArray(type: UInt8.self) switch self.bitOrder { case .reversed: self.bitMask = 1 case .straight: self.bitMask = 128 } } func bits(count: Int) -> [UInt8] { guard count > 0 else { return [] } var array: [UInt8] = Array(repeating: 0, count: count) for i in 0.. 0 ? 1 : 0 switch self.bitOrder { case .reversed: if self.bitMask == 128 { self.index += 1 self.bitMask = 1 } else { self.bitMask <<= 1 } case .straight: if self.bitMask == 1 { self.index += 1 self.bitMask = 128 } else { self.bitMask >>= 1 } } } return array } func intFromBits(count: Int) -> Int { guard count > 0 else { return 0 } var result = 0 for i in 0.. 0 ? 1 : 0 result += Int(pow(Double(2), Double(power))) * bit switch self.bitOrder { case .reversed: if self.bitMask == 128 { self.index += 1 self.bitMask = 1 } else { self.bitMask <<= 1 } case .straight: if self.bitMask == 1 { self.index += 1 self.bitMask = 128 } else { self.bitMask >>= 1 } } } return result } func bit() -> Int { let bit = self.bitArray[self.index] & self.bitMask > 0 ? 1 : 0 switch self.bitOrder { case .reversed: if self.bitMask == 128 { self.index += 1 self.bitMask = 1 } else { self.bitMask <<= 1 } case .straight: if self.bitMask == 1 { self.index += 1 self.bitMask = 128 } else { self.bitMask >>= 1 } } return bit } func alignedByte() -> UInt8 { self.skipUntilNextByte() self.index += 1 return self.bitArray[self.index - 1] } // MARK: Manipulations with index and bitShift func skipUntilNextByte() { switch self.bitOrder { case .reversed: guard self.bitMask != 1 else { return } self.bitMask = 1 case .straight: guard self.bitMask != 128 else { return } self.bitMask = 128 } self.index += 1 } }