Add RingBuffer reset and capacity

This commit is contained in:
Alexander Nozik 2024-03-17 09:29:15 +03:00
parent 203a350650
commit 86324a9219

View File

@ -23,6 +23,8 @@ public class RingBuffer<T>(
private val mutex: Mutex = Mutex() private val mutex: Mutex = Mutex()
public val capacity: Int get() = buffer.size
override var size: Int = size override var size: Int = size
private set private set
@ -32,7 +34,7 @@ public class RingBuffer<T>(
return buffer[startIndex.forward(index)] return buffer[startIndex.forward(index)]
} }
public fun isFull(): Boolean = size == buffer.size public fun isFull(): Boolean = size == capacity
/** /**
* Iterator could provide wrong results if buffer is changed in initialization (iteration is safe) * Iterator could provide wrong results if buffer is changed in initialization (iteration is safe)
@ -59,6 +61,9 @@ public class RingBuffer<T>(
VirtualBuffer(size) { i -> copy[startIndex.forward(i)] } VirtualBuffer(size) { i -> copy[startIndex.forward(i)] }
} }
/**
* Add an element to the end of the [RingBuffer]. If buffer capacity is reached, the first element is automatically removed.
*/
public suspend fun push(element: T) { public suspend fun push(element: T) {
mutex.withLock { mutex.withLock {
buffer[startIndex.forward(size)] = element buffer[startIndex.forward(size)] = element
@ -66,7 +71,15 @@ public class RingBuffer<T>(
} }
} }
private fun Int.forward(n: Int): Int = (this + n) % (buffer.size) /**
* Reset buffer to its empty state
*/
public suspend fun reset(): Unit = mutex.withLock {
startIndex = 0
size = 0
}
private fun Int.forward(n: Int): Int = (this + n) % capacity
override fun toString(): String = Buffer.toString(this) override fun toString(): String = Buffer.toString(this)
} }