XYOracleNetwork/sdk-xyo-swift

View on GitHub
Carthage/Checkouts/sdk-core-swift/sdk-core-swift/objectmodel/XyoBuffer.swift

Summary

Maintainability
F
3 days
Test Coverage
//
//  XyoBuffer.swift
//  sdk-objectmodel-swift
//
//  Created by Carter Harrison on 1/21/19.
//  Copyright © 2019 XYO Network. All rights reserved.
//

import Foundation

public class XyoBuffer {
    private let lastOffset: Int?
    let allowedOffset: Int
    internal var data: [UInt8]

    public init(data: [UInt8], allowedOffset: Int, lastOffset: Int?) {
        self.data = data
        self.allowedOffset = allowedOffset

        if lastOffset == self.data.count {
            self.lastOffset = nil
        } else {
            self.lastOffset = lastOffset
        }
    }

    public init(data: XyoBuffer, allowedOffset: Int, lastOffset: Int?) {
        self.data = data.data
        self.allowedOffset = allowedOffset

        if lastOffset == self.data.count {
            self.lastOffset = nil
        } else {
            self.lastOffset = lastOffset
        }
    }

    public init(data: [UInt8]) {
        self.data = data
        self.allowedOffset = 0
        self.lastOffset = nil
    }

    public init() {
        self.data = [UInt8]()
        self.allowedOffset = 0
        self.lastOffset = nil
    }

    private func getEnd () -> Int {
        return self.lastOffset ?? self.data.endIndex
    }

    public func getSize () -> Int {
        return  getEnd() - allowedOffset
    }

    public func toByteArray() -> [UInt8] {
        return Array(data[allowedOffset..<getEnd()])
    }

    public func getSchema(offset: Int) -> XyoObjectSchema {
        return XyoObjectSchema(id: data[allowedOffset + offset + 1], encodingCatalogue: data[allowedOffset + offset])
    }

    public func getUInt8 (offset: Int) -> UInt8 {
        return data[allowedOffset + offset]
    }

    public func getUInt16 (offset: Int) -> UInt16 {
        let two = UInt16(data[allowedOffset + offset])
        let one = UInt16(data[allowedOffset + offset + 1])

        return (two << 8) + one
    }

    public func getUInt32 (offset: Int) -> UInt32 {
        let four = UInt32(data[allowedOffset + offset])
        let three = UInt32(data[allowedOffset + offset + 1])
        let two = UInt32(data[allowedOffset + offset + 2])
        let one = UInt32(data[allowedOffset + offset + 3])

        return (four << 24) + (three << 16) + (two << 8) + one
    }

    public func getUInt64 (offset: Int) -> UInt64 {
        let eight = UInt64(data[allowedOffset + offset]) << 56
        let seven = UInt64(data[allowedOffset + offset + 1]) << 48
        let six = UInt64(data[allowedOffset + offset + 2]) << 40
        let five = UInt64(data[allowedOffset + offset + 3]) << 32
        let four = UInt64(data[allowedOffset + offset + 4]) << 24
        let three = UInt64(data[allowedOffset + offset + 5]) << 16
        let two = UInt64(data[allowedOffset + offset + 6]) << 8
        let one = UInt64(data[allowedOffset + offset + 7])

        return (one+two+three+four)+(five+six+seven+eight)
    }

    public func copyRangeOf(from: Int, toEnd: Int) -> XyoBuffer {
        let returnBuffer = XyoBuffer()

        for index in from...toEnd - 1 {
            returnBuffer.put(bits: getUInt8(offset: index))
        }

        return returnBuffer
    }

    @discardableResult
    public func put(schema: XyoObjectSchema) -> XyoBuffer {
        let schemaBytes = schema.toByteArray()
        data.append(schemaBytes[0])
        data.append(schemaBytes[1])
        return self
    }

    @discardableResult
    public func put(bytes: [UInt8]) -> XyoBuffer {
        data.append(contentsOf: bytes)
        return self
    }

    @discardableResult
    public func put(bits: UInt8) -> XyoBuffer {
        data.append(bits)
        return self
    }

    @discardableResult
    public func put(bits: UInt16) -> XyoBuffer {
        data.append(UInt8((bits >> 8) & 0xFF))
        data.append(UInt8(bits & 0xFF))
        return self
    }

    @discardableResult
    public func put(bits: UInt32) -> XyoBuffer {
        data.append(UInt8((bits >> 24) & 0xFF))
        data.append(UInt8((bits >> 16) & 0xFF))
        data.append(UInt8((bits >> 8) & 0xFF))
        data.append(UInt8(bits & 0xFF))
        return self
    }

    @discardableResult
    public func put(bits: UInt64) -> XyoBuffer {
        data.append(UInt8((bits >> 56) & 0xFF))
        data.append(UInt8((bits >> 48) & 0xFF))
        data.append(UInt8((bits >> 40) & 0xFF))
        data.append(UInt8((bits >> 32) & 0xFF))
        data.append(UInt8((bits >> 24) & 0xFF))
        data.append(UInt8((bits >> 16) & 0xFF))
        data.append(UInt8((bits >> 8) & 0xFF))
        data.append(UInt8(bits & 0xFF))
        return self
    }

    @discardableResult
    public func put (buffer: XyoBuffer) -> XyoBuffer {
        return put(bytes: buffer.toByteArray())
    }
}