diff --git a/src/main/java/network/xyo/sdkobjectmodelkotlin/buffer/XyoBuff.kt b/src/main/java/network/xyo/sdkobjectmodelkotlin/buffer/XyoBuff.kt index 96f811e..6085531 100644 --- a/src/main/java/network/xyo/sdkobjectmodelkotlin/buffer/XyoBuff.kt +++ b/src/main/java/network/xyo/sdkobjectmodelkotlin/buffer/XyoBuff.kt @@ -75,6 +75,9 @@ abstract class XyoBuff { val buffer = ByteBuffer.allocate(sizeToReadForSize) buffer.put(item.copyOfRange(offset, offset + sizeToReadForSize)) +// println(offset) +// println(item.copyOfRange(offset, offset + sizeToReadForSize).toHexString()) + when (sizeToReadForSize) { 1 -> return buffer[0].toInt() and 0xFF 2 -> return buffer.getShort(0).toInt() and 0xFFFF @@ -131,9 +134,11 @@ abstract class XyoBuff { * @param value The value of the XyoBuff to create. This does NOT include size. */ fun getObjectEncoded (schema: XyoObjectSchema, value: ByteArray) : ByteArray { - val buffer = ByteBuffer.allocate(value.size + schema.sizeIdentifier + 2) - buffer.put(schema.header) - buffer.put(XyoNumberEncoder.createSize(value.size, schema.sizeIdentifier)) + val newSchema = schema.toNewSize(XyoNumberEncoder.getSmartSize(value.size)) + + val buffer = ByteBuffer.allocate(value.size + newSchema.sizeIdentifier + 2) + buffer.put(newSchema.header) + buffer.put(XyoNumberEncoder.createSize(value.size, newSchema.sizeIdentifier)) buffer.put(value) return buffer.array() } diff --git a/src/main/java/network/xyo/sdkobjectmodelkotlin/objects/XyoIterableObject.kt b/src/main/java/network/xyo/sdkobjectmodelkotlin/objects/XyoIterableObject.kt index 7c077f7..0746a47 100644 --- a/src/main/java/network/xyo/sdkobjectmodelkotlin/objects/XyoIterableObject.kt +++ b/src/main/java/network/xyo/sdkobjectmodelkotlin/objects/XyoIterableObject.kt @@ -17,17 +17,6 @@ abstract class XyoIterableObject : XyoBuff() { */ private var globalSchema : XyoObjectSchema? = null - /** - * The largest offset known currently. This is used so the array is not iterated over many times. - */ - private var biggestOffset : Int = 0 - - /** - * An array of the current offsets where items lie (a table of contents from index to offset for the item at that - * index.) - */ - private val offsets = ArrayList() - /** * Gets an instance of a new iterator to illiterate over the set. * @@ -35,7 +24,6 @@ abstract class XyoIterableObject : XyoBuff() { */ open val iterator : Iterator get() { - readHeaderIfNeeded() return XyoObjectIterator(readOwnHeader()) } @@ -46,28 +34,17 @@ abstract class XyoIterableObject : XyoBuff() { */ open val count : Int get() { - readHeaderIfNeeded() - if (biggestOffset == sizeBytes + 2) { - return offsets.size - } - val sizeIt = XyoObjectIterator(biggestOffset) - while (sizeIt.hasNext()) {sizeIt.next()} - return offsets.size + val sizeIt = iterator + var i = 0 + while (sizeIt.hasNext()) { + i++ + sizeIt.next() + } + return i } - /** - * Reads the current header of the array if the global offset is 0. - * - * @throws XyoObjectIteratorException If the bytes are malformed. - */ - private fun readHeaderIfNeeded () { - if (biggestOffset == 0) { - biggestOffset = readOwnHeader() - } - } - /** * Reads the current item at an offset. * @@ -97,11 +74,6 @@ abstract class XyoIterableObject : XyoBuff() { throw XyoObjectIteratorException("Size can not be 0. Value: ${item.toHexString()}") } - if (biggestOffset <= startingOffset) { - offsets.add(startingOffset) - biggestOffset = startingOffset + sizeOfObject + 2 - } - checkIndex(startingOffset + sizeOfObject + 2) if (schemaOfItem.isIterable) { @@ -132,11 +104,6 @@ abstract class XyoIterableObject : XyoBuff() { throw XyoObjectIteratorException("Size can not be 0. Value: ${item.toHexString()}") } - if (biggestOffset <= startingOffset) { - offsets.add(startingOffset) - biggestOffset = startingOffset + sizeOfObject - } - val buffer = ByteBuffer.allocate(sizeOfObject + 2) checkIndex(startingOffset + sizeOfObject) buffer.put(schemaOfItem.header) @@ -169,13 +136,8 @@ abstract class XyoIterableObject : XyoBuff() { * @throws XyoObjectIteratorException if the bytes are malformed or if the index is out of range. */ open operator fun get(index: Int): XyoBuff { - readHeaderIfNeeded() - if (index < offsets.size) { - return readItemAtOffset(offsets[index]) - } - - val it = XyoObjectIterator(biggestOffset) - var i = offsets.size + val it = iterator + var i = 0 while (it.hasNext()) { val item = it.next() @@ -199,8 +161,7 @@ abstract class XyoIterableObject : XyoBuff() { * @throws XyoObjectIteratorException if the bytes are malformed. */ open operator fun get(type: Byte): Array { - readHeaderIfNeeded() - val it = XyoObjectIterator(readOwnHeader()) + val it = iterator val itemsThatFollowTheType = ArrayList() while (it.hasNext()) { diff --git a/src/main/java/network/xyo/sdkobjectmodelkotlin/objects/XyoNumberEncoder.kt b/src/main/java/network/xyo/sdkobjectmodelkotlin/objects/XyoNumberEncoder.kt index a9c3283..dd4109a 100644 --- a/src/main/java/network/xyo/sdkobjectmodelkotlin/objects/XyoNumberEncoder.kt +++ b/src/main/java/network/xyo/sdkobjectmodelkotlin/objects/XyoNumberEncoder.kt @@ -19,6 +19,7 @@ object XyoNumberEncoder { */ fun createSize (sizeOfItem : Int, sizeOfSize : Int) : ByteArray { val basBuffer = ByteBuffer.allocate(sizeOfSize) + when (sizeOfSize) { 1 -> basBuffer.put((sizeOfItem + 1).toByte()) 2 -> basBuffer.putShort((sizeOfItem + 2).toShort()) diff --git a/src/main/java/network/xyo/sdkobjectmodelkotlin/schema/XyoObjectSchema.kt b/src/main/java/network/xyo/sdkobjectmodelkotlin/schema/XyoObjectSchema.kt index 0671018..a62d85b 100644 --- a/src/main/java/network/xyo/sdkobjectmodelkotlin/schema/XyoObjectSchema.kt +++ b/src/main/java/network/xyo/sdkobjectmodelkotlin/schema/XyoObjectSchema.kt @@ -195,11 +195,12 @@ abstract class XyoObjectSchema { // masking the first two bits to get the result // 0xC0 == 11000000 + if (encodingCatalogue and 0xC0.toByte() == 0x00.toByte()) { return 1 } - if (encodingCatalogue and 0xC0 .toByte() == 0x40.toByte()) { + if (encodingCatalogue and 0xC0.toByte() == 0x40.toByte()) { return 2 } @@ -207,8 +208,7 @@ abstract class XyoObjectSchema { return 4 } - if (encodingCatalogue and 0xC0.toByte() == 0xC0.toByte()) { - return 8 + if (encodingCatalogue and 0xC0.toByte() == 0xC0.toByte()) { return 8 } throw XyoSchemaException("Invalid Size: ${encodingCatalogue.toString(2)}")