diff --git a/okio/api/okio.api b/okio/api/okio.api index 05c4ab6191..fa06f8462a 100644 --- a/okio/api/okio.api +++ b/okio/api/okio.api @@ -43,6 +43,23 @@ public final class okio/-InflaterSourceExtensions { public static synthetic fun inflate$default (Lokio/Source;Ljava/util/zip/Inflater;ILjava/lang/Object;)Lokio/InflaterSource; } +public final class okio/-Unsigned { + public static final fun readUByte (Lokio/BufferedSource;)B + public static final fun readUInt (Lokio/BufferedSource;)I + public static final fun readUIntLe (Lokio/BufferedSource;)I + public static final fun readULong (Lokio/BufferedSource;)J + public static final fun readULongLe (Lokio/BufferedSource;)J + public static final fun readUShort (Lokio/BufferedSource;)S + public static final fun readUShortLe (Lokio/BufferedSource;)S + public static final fun writeUByte-EK-6454 (Lokio/BufferedSink;B)Lokio/BufferedSink; + public static final fun writeUInt-Qn1smSk (Lokio/BufferedSink;I)Lokio/BufferedSink; + public static final fun writeUIntLe-Qn1smSk (Lokio/BufferedSink;I)Lokio/BufferedSink; + public static final fun writeULong-2TYgG_w (Lokio/BufferedSink;J)Lokio/BufferedSink; + public static final fun writeULongLe-2TYgG_w (Lokio/BufferedSink;J)Lokio/BufferedSink; + public static final fun writeUShort-i8woANY (Lokio/BufferedSink;S)Lokio/BufferedSink; + public static final fun writeUShortLe-i8woANY (Lokio/BufferedSink;S)Lokio/BufferedSink; +} + public class okio/AsyncTimeout : okio/Timeout { public fun ()V public final fun access$newTimeoutException (Ljava/io/IOException;)Ljava/io/IOException; diff --git a/okio/src/commonMain/kotlin/okio/Unsigned.kt b/okio/src/commonMain/kotlin/okio/Unsigned.kt new file mode 100644 index 0000000000..4a00fdbf11 --- /dev/null +++ b/okio/src/commonMain/kotlin/okio/Unsigned.kt @@ -0,0 +1,357 @@ +/* + * Copyright (C) 2019 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:JvmName("-Unsigned") +@file:Suppress("NOTHING_TO_INLINE") // Syntactic sugar. + +package okio + +import kotlin.jvm.JvmName + +/** Writes an unsigned byte to this sink. */ +@Throws(IOException::class) +inline fun S.writeUByte(b: UByte): S { + writeByte(b.toByte().toInt()) + return this +} + +/** + * Writes a big-endian, unsigned short to this sink using two bytes. + * ``` + * val buffer = Buffer() + * buffer.writeUShort(65534u.toUShort()) + * buffer.writeUShort(15u.toUShort()) + * + * assertEquals(4, buffer.size) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xfe.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x0f.toByte(), buffer.readByte()) + * assertEquals(0, buffer.size) + * ``` + */ +@Throws(IOException::class) +inline fun S.writeUShort(b: UShort): S { + writeShort(b.toShort().toInt()) + return this +} + +/** + * Writes a little-endian, unsigned short to this sink using two bytes. + * ``` + * val buffer = Buffer() + * buffer.writeUShortLe(65534u.toUShort()) + * buffer.writeUShortLe(15u.toUShort()) + * + * assertEquals(4, buffer.size) + * assertEquals(0xfe.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0x0f.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0, buffer.size) + * ``` + */ +@Throws(IOException::class) +inline fun S.writeUShortLe(b: UShort): S { + writeShortLe(b.toShort().toInt()) + return this +} + +/** + * Writes a big-endian, unsigned int to this sink using four bytes. + * ``` + * val buffer = Buffer() + * buffer.writeUInt(4294967294u) + * buffer.writeUInt(15u) + * + * assertEquals(8, buffer.size) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xfe.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x0f.toByte(), buffer.readByte()) + * assertEquals(0, buffer.size) + * ``` + */ +@Throws(IOException::class) +inline fun S.writeUInt(b: UInt): S { + writeInt(b.toInt()) + return this +} + +/** + * Writes a little-endian, unsigned int to this sink using four bytes. + * ``` + * val buffer = Buffer() + * buffer.writeUIntLe(4294967294u) + * buffer.writeUIntLe(15u) + * + * assertEquals(8, buffer.size) + * assertEquals(0xfe.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0x0f.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0, buffer.size) + * ``` + */ +@Throws(IOException::class) +inline fun S.writeUIntLe(b: UInt): S { + writeIntLe(b.toInt()) + return this +} + +/** + * Writes a big-endian, unsigned long to this sink using eight bytes. + * ``` + * val buffer = Buffer() + * buffer.writeULong(18446744073709551614uL) + * buffer.writeULong(15u) + * + * assertEquals(16, buffer.size) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xfe.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x0f.toByte(), buffer.readByte()) + * assertEquals(0, buffer.size) + * ``` + */ +@Throws(IOException::class) +inline fun S.writeULong(b: ULong): S { + writeLong(b.toLong()) + return this +} + +/** + * Writes a little-endian, unsigned long to this sink using eight bytes. + * ``` + * val buffer = Buffer() + * buffer.writeULongLe(18446744073709551614uL) + * buffer.writeULongLe(15uL) + * + * assertEquals(16, buffer.size) + * assertEquals(0xfe.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0xff.toByte(), buffer.readByte()) + * assertEquals(0x0f.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0x00.toByte(), buffer.readByte()) + * assertEquals(0, buffer.size) + * ``` + */ +@Throws(IOException::class) +inline fun S.writeULongLe(b: ULong): S { + writeLongLe(b.toLong()) + return this +} + +/** Removes an unsigned byte from this source and returns it. */ +@Throws(IOException::class) +inline fun BufferedSource.readUByte(): UByte { + return readByte().toUByte() +} + +/** + * Removes two bytes from this source and returns a big-endian, unsigned short. + * ``` + * val buffer = Buffer() + * .writeByte(0xff) + * .writeByte(0xfe) + * .writeByte(0x00) + * .writeByte(0x0f) + * assertEquals(4, buffer.size) + * + * assertEquals(65534u.toUShort(), buffer.readUShort()) + * assertEquals(2, buffer.size) + * + * assertEquals(15u.toUShort(), buffer.readUShort()) + * assertEquals(0, buffer.size) + * ``` + */ +@Throws(IOException::class) +inline fun BufferedSource.readUShort(): UShort { + return readShort().toUShort() +} + +/** + * Removes two bytes from this source and returns a little-endian, unsigned short. + * ``` + * val buffer = Buffer() + * .writeByte(0xfe) + * .writeByte(0xff) + * .writeByte(0x0f) + * .writeByte(0x00) + * assertEquals(4, buffer.size) + * + * assertEquals(65534u.toUShort(), buffer.readUShortLe()) + * assertEquals(2, buffer.size) + * + * assertEquals(15u.toUShort(), buffer.readUShortLe()) + * assertEquals(0, buffer.size) + * ``` + */ +@Throws(IOException::class) +inline fun BufferedSource.readUShortLe(): UShort { + return readShortLe().toUShort() +} + +/** + * Removes four bytes from this source and returns a big-endian, unsigned int. + * ``` + * val buffer = Buffer() + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xfe) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x0f) + * assertEquals(4, buffer.size) + * + * assertEquals(4294967294u, buffer.readUInt()) + * assertEquals(2, buffer.size) + * + * assertEquals(15u, buffer.readUInt()) + * assertEquals(0, buffer.size) + * ``` + */ +@Throws(IOException::class) +inline fun BufferedSource.readUInt(): UInt { + return readInt().toUInt() +} + +/** + * Removes four bytes from this source and returns a little-endian, unsigned int. + * ``` + * val buffer = Buffer() + * .writeByte(0xfe) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0x0f) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x00) + * assertEquals(8, buffer.size) + * + * assertEquals(4294967294u, buffer.readUIntLe()) + * assertEquals(4, buffer.size) + * + * assertEquals(15u, buffer.readUIntLe()) + * assertEquals(0, buffer.size) + * ``` + */ +@Throws(IOException::class) +inline fun BufferedSource.readUIntLe(): UInt { + return readIntLe().toUInt() +} + +/** + * Removes eight bytes from this source and returns a big-endian, unsigned long. + * ``` + * val buffer = Buffer() + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xfe) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x0f) + * assertEquals(16, buffer.size) + * + * assertEquals(18446744073709551614uL, buffer.readULong()) + * assertEquals(8, buffer.size) + * + * assertEquals(15u, buffer.readULong()) + * assertEquals(0, buffer.size) + * ``` + */ +@Throws(IOException::class) +inline fun BufferedSource.readULong(): ULong { + return readLong().toULong() +} + +/** + * Removes eight bytes from this source and returns a little-endian, unsigned long. + * ``` + * val buffer = Buffer() + * .writeByte(0xfe) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0xff) + * .writeByte(0x0f) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x00) + * .writeByte(0x00) + * assertEquals(16, buffer.size) + * + * assertEquals(18446744073709551614uL, buffer.readULongLe()) + * assertEquals(8, buffer.size) + * + * assertEquals(15u, buffer.readULongLe()) + * assertEquals(0, buffer.size) + * ``` + */ +@Throws(IOException::class) +inline fun BufferedSource.readULongLe(): ULong { + return readLongLe().toULong() +} diff --git a/okio/src/commonTest/kotlin/okio/UnsignedTest.kt b/okio/src/commonTest/kotlin/okio/UnsignedTest.kt new file mode 100644 index 0000000000..ccdf1ed84a --- /dev/null +++ b/okio/src/commonTest/kotlin/okio/UnsignedTest.kt @@ -0,0 +1,279 @@ +/* + * Copyright (C) 2019 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package okio + +import kotlin.test.Test +import kotlin.test.assertEquals + +class UnsignedTest { + @Test + fun writeUnsignedByte() { + val buffer = Buffer() + buffer.writeUByte(254u.toUByte()) + buffer.writeUByte(15u.toUByte()) + + assertEquals(2, buffer.size) + assertEquals(0xfe.toByte(), buffer.readByte()) + assertEquals(0x0f.toByte(), buffer.readByte()) + assertEquals(0, buffer.size) + } + + @Test fun readUnsignedByte() { + val buffer = Buffer() + .writeByte(0xfe) + .writeByte(0x0f) + assertEquals(2, buffer.size) + + assertEquals(254u.toUByte(), buffer.readUByte()) + assertEquals(1, buffer.size) + + assertEquals(15u.toUByte(), buffer.readUByte()) + assertEquals(0, buffer.size) + } + + @Test fun writeUnsignedShort() { + val buffer = Buffer() + buffer.writeUShort(65534u.toUShort()) + buffer.writeUShort(15u.toUShort()) + + assertEquals(4, buffer.size) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xfe.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x0f.toByte(), buffer.readByte()) + assertEquals(0, buffer.size) + } + + @Test fun readUnsignedShort() { + val buffer = Buffer() + .writeByte(0xff) + .writeByte(0xfe) + .writeByte(0x00) + .writeByte(0x0f) + assertEquals(4, buffer.size) + + assertEquals(65534u.toUShort(), buffer.readUShort()) + assertEquals(2, buffer.size) + + assertEquals(15u.toUShort(), buffer.readUShort()) + assertEquals(0, buffer.size) + } + + @Test fun writeUnsignedShortLittleEndian() { + val buffer = Buffer() + buffer.writeUShortLe(65534u.toUShort()) + buffer.writeUShortLe(15u.toUShort()) + + assertEquals(4, buffer.size) + assertEquals(0xfe.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0x0f.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0, buffer.size) + } + + @Test fun readUnsignedShortLittleEndian() { + val buffer = Buffer() + .writeByte(0xfe) + .writeByte(0xff) + .writeByte(0x0f) + .writeByte(0x00) + assertEquals(4, buffer.size) + + assertEquals(65534u.toUShort(), buffer.readUShortLe()) + assertEquals(2, buffer.size) + + assertEquals(15u.toUShort(), buffer.readUShortLe()) + assertEquals(0, buffer.size) + } + + @Test fun writeUnsignedInt() { + val buffer = Buffer() + buffer.writeUInt(4294967294u) + buffer.writeUInt(15u) + + assertEquals(8, buffer.size) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xfe.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x0f.toByte(), buffer.readByte()) + assertEquals(0, buffer.size) + } + + @Test fun readUnsignedInt() { + val buffer = Buffer() + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xfe) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x0f) + assertEquals(8, buffer.size) + + assertEquals(4294967294u, buffer.readUInt()) + assertEquals(4, buffer.size) + + assertEquals(15u, buffer.readUInt()) + assertEquals(0, buffer.size) + } + + @Test fun writeUnsignedIntLittleEndian() { + val buffer = Buffer() + buffer.writeUIntLe(4294967294u) + buffer.writeUIntLe(15u) + + assertEquals(8, buffer.size) + assertEquals(0xfe.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0x0f.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0, buffer.size) + } + + @Test fun readUnsignedIntLittleEndian() { + val buffer = Buffer() + .writeByte(0xfe) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0x0f) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x00) + assertEquals(8, buffer.size) + + assertEquals(4294967294u, buffer.readUIntLe()) + assertEquals(4, buffer.size) + + assertEquals(15u, buffer.readUIntLe()) + assertEquals(0, buffer.size) + } + + @Test fun writeUnsignedLong() { + val buffer = Buffer() + buffer.writeULong(18446744073709551614uL) + buffer.writeULong(15u) + + assertEquals(16, buffer.size) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xfe.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x0f.toByte(), buffer.readByte()) + assertEquals(0, buffer.size) + } + + @Test fun readUnsignedLong() { + val buffer = Buffer() + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xfe) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x0f) + assertEquals(16, buffer.size) + + assertEquals(18446744073709551614uL, buffer.readULong()) + assertEquals(8, buffer.size) + + assertEquals(15u, buffer.readULong()) + assertEquals(0, buffer.size) + } + + @Test fun writeUnsignedLongLittleEndian() { + val buffer = Buffer() + buffer.writeULongLe(18446744073709551614uL) + buffer.writeULongLe(15uL) + + assertEquals(16, buffer.size) + assertEquals(0xfe.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0xff.toByte(), buffer.readByte()) + assertEquals(0x0f.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0x00.toByte(), buffer.readByte()) + assertEquals(0, buffer.size) + } + + @Test fun readUnsignedLongLittleEndian() { + val buffer = Buffer() + .writeByte(0xfe) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0xff) + .writeByte(0x0f) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x00) + .writeByte(0x00) + assertEquals(16, buffer.size) + + assertEquals(18446744073709551614uL, buffer.readULongLe()) + assertEquals(8, buffer.size) + + assertEquals(15u, buffer.readULongLe()) + assertEquals(0, buffer.size) + } +}