Document and make more consistent buffers API

This commit is contained in:
Iaroslav Postovalov 2020-08-06 12:39:50 +07:00
parent eae218ff5f
commit 9f6bd116f6
No known key found for this signature in database
GPG Key ID: 70D5F4DCB0972F1B
3 changed files with 44 additions and 7 deletions

View File

@ -97,10 +97,13 @@ val Buffer<*>.indices: IntRange get() = 0 until size
* A generic mutable random-access structure for both primitives and objects. * A generic mutable random-access structure for both primitives and objects.
*/ */
interface MutableBuffer<T> : Buffer<T> { interface MutableBuffer<T> : Buffer<T> {
/**
* Sets the array element at the specified [index] to the specified [value].
*/
operator fun set(index: Int, value: T) operator fun set(index: Int, value: T)
/** /**
* A shallow copy of the buffer * Returns a shallow copy of the buffer.
*/ */
fun copy(): MutableBuffer<T> fun copy(): MutableBuffer<T>

View File

@ -21,6 +21,28 @@ inline class IntBuffer(val array: IntArray) : MutableBuffer<Int> {
} }
/**
* Creates a new [IntBuffer] with the specified [size], where each element is calculated by calling the specified
* [init] function.
*
* The function [init] is called for each array element sequentially starting from the first one.
* It should return the value for an array element given its index.
*/
@Suppress("FunctionName")
inline fun IntBuffer(size: Int, init: (Int) -> Int): IntBuffer = IntBuffer(IntArray(size) { init(it) })
/**
* Returns a new [IntBuffer] of given elements.
*/
@Suppress("FunctionName")
fun IntBuffer(vararg ints: Int): IntBuffer = IntBuffer(ints)
/**
* Returns a [IntArray] containing all of the elements of this [MutableBuffer].
*/
val MutableBuffer<out Int>.array: IntArray
get() = (if (this is IntBuffer) array else IntArray(size) { get(it) })
/** /**
* Returns [IntBuffer] over this array. * Returns [IntBuffer] over this array.
* *

View File

@ -15,20 +15,32 @@ inline class RealBuffer(val array: DoubleArray) : MutableBuffer<Double> {
RealBuffer(array.copyOf()) RealBuffer(array.copyOf())
} }
/**
* Creates a new array with the specified [size], where each element is calculated by calling the specified
* [init] function.
*
* The function [init] is called for each array element sequentially starting from the first one.
* It should return the value for an array element given its index.
*/
@Suppress("FunctionName") @Suppress("FunctionName")
inline fun RealBuffer(size: Int, init: (Int) -> Double): RealBuffer = RealBuffer(DoubleArray(size) { init(it) }) inline fun RealBuffer(size: Int, init: (Int) -> Double): RealBuffer = RealBuffer(DoubleArray(size) { init(it) })
/**
* Returns a new [RealBuffer] of given elements.
*/
@Suppress("FunctionName") @Suppress("FunctionName")
fun RealBuffer(vararg doubles: Double): RealBuffer = RealBuffer(doubles) fun RealBuffer(vararg doubles: Double): RealBuffer = RealBuffer(doubles)
/** /**
* Transform buffer of doubles into array for high performance operations * Returns a [DoubleArray] containing all of the elements of this [MutableBuffer].
*/ */
val MutableBuffer<out Double>.array: DoubleArray val MutableBuffer<out Double>.array: DoubleArray
get() = if (this is RealBuffer) { get() = (if (this is RealBuffer) array else DoubleArray(size) { get(it) })
array
} else {
DoubleArray(size) { get(it) }
}
/**
* Returns [RealBuffer] over this array.
*
* @receiver the array.
* @return the new buffer.
*/
fun DoubleArray.asBuffer(): RealBuffer = RealBuffer(this) fun DoubleArray.asBuffer(): RealBuffer = RealBuffer(this)