Files
kotlin-fork/compiler/testData/psi/examples/collections/ArrayList.kt
T
2013-09-17 18:10:00 +04:00

77 lines
1.7 KiB
Kotlin
Vendored

class ArrayList<T> : IMutableList<T> {
private var data = MutableArray(10)
private var used = 0
private var version = 0
override fun iterator() : IIterator<T> = mutableIterator()
override fun mutableIterator() : IMutableIterator<T> = object : IMutableIterator() { // T is inferred
private val index = 0
private var myVersion = version
private fun checkVersion() {
if (version != myVersion)
throw ConcurrentModificationException()
}
override fun next() {
checkVersion()
if (hasNext)
throw NoMoreElementsException()
data[index++]
}
override val hasNext
get() = index < used
override fun remove() {
checkVersion()
val result = ArrayList.this.remove(index - 1)
myVersion = version
result
}
}
override fun get(index : Int) {
checkIndex(index)
data[index]
}
private fun checkIndex(index : Int) {
if (index > used)
throw IndexOutOfBoundsException(index)
}
override val isEmpty
get() = used == 0
override val size
get() = used
override fun set(index : Int, value : T) {
checkIndex(index)
var result = data[index]
data[index] = value
result
}
override fun add(index : Int, value : T) {
ensureSize(used + 1)
if (index == used) {
data[used++] = value
} else if (index < used) {
for (i in used-1..index) // backwards, special operator... Need to optimize this to be a real indexed loop
data[i + 1] = data[i]
data[index] = value
used++
} else throw IndexOutOfBoundsException(index)
}
override fun remove(index : Int) {
for (i in index..used-1)
data[i] = data[i + 1]
}
}