import Foundation

extension Data {
    
    // MARK: UnsafebufferPointer dangling warning
    /* data.append(UnsafeBufferPointer(start: &hashValue, count: 1))
       Initialization of 'UnsafeBufferPointer' results in a dangling buffer pointer
     1. let data = Data(hashValue)
     2. let data = Data()
        data.appnd(value: value)
     */
    init<T>(value: T) {
        self = withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) -> Data in
            return Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
        }
    }

    mutating func append<T>(value: T) {
        withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) in
            append(UnsafeBufferPointer(start: ptr, count: 1))
        }
    }
    
    // MARK: HaxEncodedString
    struct HexEncodingOptions: OptionSet {
        let rawValue: Int
        static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
    }

    func hexEncodedString(options: HexEncodingOptions = []) -> String {
        let hexDigits = Array((options.contains(.upperCase) ? "0123456789ABCDEF" : "0123456789abcdef").utf16)
        var chars: [unichar] = []
        chars.reserveCapacity(2 * count)
        for byte in self {
            chars.append(hexDigits[Int(byte / 16)])
            chars.append(hexDigits[Int(byte % 16)])
        }
        return String(utf16CodeUnits: chars, count: chars.count)
    }
    
    /// Hex String -> Data
    public init(hex: String) {
      self.init(Array<UInt8>(hex: hex))
    }
    
    /// Data -> Array<UInt8>
    public var bytes: Array<UInt8> {
      Array(self)
    }

    /// Data -> Hex String
    public func toHexString() -> String {
      self.bytes.toHexString()
    }
}


/*
var hasher = Hasher()
hasher.combine(patternString)
var hashValue = hasher.finalize()
var data = Data()
data.append(UnsafeBufferPointer(start: &hashValue, count: 1))

log(direction: .ETC, ofType: self, datas: data.hexEncodedString())
*/

+ Recent posts