Sha256: a324843f708234597589fed4e87ef08ae15d24f90fa154542636c9a364a4b1e8

Contents?: true

Size: 1.42 KB

Versions: 44

Compression:

Stored size: 1.42 KB

Contents

import Foundation

enum CircularBufferError: Error {
    case bufferFull
    case bufferEmpty
}

struct CircularBuffer<T: Equatable> {
    var buffer: [T?]
    let capacity: Int
    var writePoint = 0
    var readPoint = 0

    private var isFull: Bool {
        return buffer.flatMap { $0 }.count >= capacity
    }

    private var isEmpty: Bool {
        return buffer.flatMap { $0 }.isEmpty
    }

    init(capacity: Int) {
        self.capacity = capacity
        buffer = [T?](repeating: nil, count: capacity)
    }

    mutating func write(_ data: T) throws {
        guard !isFull else {
            throw CircularBufferError.bufferFull
        }

        buffer[writePoint] = data
        updateWritePoint()
    }

    mutating func overwrite(_ data: T) {
        buffer[writePoint] = data
        if isFull && writePoint == readPoint {
            updateReadPoint()
        }
        updateWritePoint()
    }

    mutating func read() throws -> T {
        guard let data = buffer[readPoint] else {
            throw CircularBufferError.bufferEmpty
        }

        buffer[readPoint] = nil
        updateReadPoint()

        return data
    }

    mutating func clear() {
        buffer = [T?](repeating: nil, count: capacity)
    }

    private mutating func updateWritePoint() {
        writePoint = (writePoint + 1) % capacity
    }

    private mutating func updateReadPoint() {
        readPoint = (readPoint + 1) % capacity
    }
}

Version data entries

44 entries across 44 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.179 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.178 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.177 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.176 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.175 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.174 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.173 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.172 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.171 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.170 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.169 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.167 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.166 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.165 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.164 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.163 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.162 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.161 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift
trackler-2.2.1.160 tracks/swift/exercises/circular-buffer/Sources/CircularBufferExample.swift