From a96b520331f10e58e512accb11d6c326706765ad Mon Sep 17 00:00:00 2001 From: Bixilon Date: Fri, 16 Dec 2022 10:28:30 +0100 Subject: [PATCH] use fragmented list, fix fragmented list bugs --- .../util/collections/floats/FloatListUtil.kt | 2 +- .../floats/FragmentedArrayFloatList.kt | 8 ++++-- .../floats/AbstractFloatListTest.kt | 25 +++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/util/collections/floats/FloatListUtil.kt b/src/main/java/de/bixilon/minosoft/util/collections/floats/FloatListUtil.kt index 152e98ada..58540954d 100644 --- a/src/main/java/de/bixilon/minosoft/util/collections/floats/FloatListUtil.kt +++ b/src/main/java/de/bixilon/minosoft/util/collections/floats/FloatListUtil.kt @@ -19,7 +19,7 @@ import org.lwjgl.system.MemoryUtil.memFree import java.nio.FloatBuffer object FloatListUtil { - const val PREFER_FRAGMENTED = false + const val PREFER_FRAGMENTED = true val FLOAT_PUT_METHOD = ExceptionUtil.catchAll { FloatBuffer::class.java.getMethod("put", Int::class.java, FloatBuffer::class.java, Int::class.java, Int::class.java) } const val DEFAULT_INITIAL_SIZE = 1000 diff --git a/src/main/java/de/bixilon/minosoft/util/collections/floats/FragmentedArrayFloatList.kt b/src/main/java/de/bixilon/minosoft/util/collections/floats/FragmentedArrayFloatList.kt index 0535705f1..ff9c62858 100644 --- a/src/main/java/de/bixilon/minosoft/util/collections/floats/FragmentedArrayFloatList.kt +++ b/src/main/java/de/bixilon/minosoft/util/collections/floats/FragmentedArrayFloatList.kt @@ -100,7 +100,7 @@ class FragmentedArrayFloatList( if (tryPush(fragment)) indexOffset-- - if (array.size - offset <= remaining) { + if (array.size - offset < remaining) { // everything copied size += array.size return @@ -130,7 +130,7 @@ class FragmentedArrayFloatList( offset += copy if (tryPush(fragment)) indexOffset-- - if (position - offset <= remaining) { + if (position - offset < remaining) { // everything copied size += position return @@ -239,6 +239,10 @@ class FragmentedArrayFloatList( } val buffer = memAllocFloat(size) forEach { it.copy(buffer) } + if (buffer.position() != this.size) { + // TODO: this should never happen, remove this check + throw Exception("Position mismatch: ${buffer.position()}, expected $size") + } this.buffer = buffer return buffer } diff --git a/src/test/java/de/bixilon/minosoft/util/collections/floats/AbstractFloatListTest.kt b/src/test/java/de/bixilon/minosoft/util/collections/floats/AbstractFloatListTest.kt index a1bde06ff..ff72db6c8 100644 --- a/src/test/java/de/bixilon/minosoft/util/collections/floats/AbstractFloatListTest.kt +++ b/src/test/java/de/bixilon/minosoft/util/collections/floats/AbstractFloatListTest.kt @@ -440,6 +440,31 @@ abstract class AbstractFloatListTest { } } + @Test + fun clear() { + val list = create() + list.add(1.0f) + list.add(2.0f) + list.clear() + assertEquals(0, list.toArray().size) + list.add(3.0f) + list.add(4.0f) + assertContentEquals(floatArrayOf(3.0f, 4.0f), list.toArray()) + } + + @Test + fun clearBig() { + val list = create() + list.add(1.0f) + list.add(FloatArray(1000) { 1.0f + it }) + list.add(FloatArray(2000) { 1001.0f + it }) + list.clear() + assertEquals(0, list.toArray().size) + list.add(3.0f) + list.add(4.0f) + assertContentEquals(floatArrayOf(3.0f, 4.0f), list.toArray()) + } + private fun wrap(vararg array: Float): FloatBuffer { val buffer = FloatBuffer.wrap(array) buffer.position(array.size)