From 50c666f4306c551d56efb851a28bb7709ecdf378 Mon Sep 17 00:00:00 2001 From: Brian Norman Date: Fri, 23 Aug 2019 12:10:04 -0500 Subject: [PATCH] Add BufferedSink.write(ByteString, offset, byteCount) --- okio/src/commonMain/kotlin/okio/Buffer.kt | 2 ++ okio/src/commonMain/kotlin/okio/BufferedSink.kt | 2 ++ okio/src/commonMain/kotlin/okio/ByteString.kt | 2 +- okio/src/commonMain/kotlin/okio/internal/Buffer.kt | 8 ++++++-- .../commonMain/kotlin/okio/internal/ByteString.kt | 4 ++-- .../kotlin/okio/internal/SegmentedByteString.kt | 4 ++-- okio/src/jsMain/kotlin/okio/Buffer.kt | 3 +++ okio/src/jsMain/kotlin/okio/BufferedSink.kt | 2 ++ okio/src/jsMain/kotlin/okio/ByteString.kt | 3 ++- okio/src/jsMain/kotlin/okio/SegmentedByteString.kt | 3 ++- okio/src/jvmMain/kotlin/okio/Buffer.kt | 3 +++ okio/src/jvmMain/kotlin/okio/BufferedSink.kt | 3 +++ okio/src/jvmMain/kotlin/okio/ByteString.kt | 3 ++- okio/src/jvmMain/kotlin/okio/RealBufferedSink.kt | 6 ++++++ okio/src/jvmMain/kotlin/okio/SegmentedByteString.kt | 3 ++- okio/src/jvmTest/java/okio/BufferedSinkTest.java | 12 ++++++++++++ okio/src/nativeMain/kotlin/okio/Buffer.kt | 3 +++ okio/src/nativeMain/kotlin/okio/BufferedSink.kt | 2 ++ okio/src/nativeMain/kotlin/okio/ByteString.kt | 3 ++- .../nativeMain/kotlin/okio/SegmentedByteString.kt | 3 ++- 20 files changed, 61 insertions(+), 13 deletions(-) diff --git a/okio/src/commonMain/kotlin/okio/Buffer.kt b/okio/src/commonMain/kotlin/okio/Buffer.kt index 6f554051f5..d1279ddefa 100644 --- a/okio/src/commonMain/kotlin/okio/Buffer.kt +++ b/okio/src/commonMain/kotlin/okio/Buffer.kt @@ -71,6 +71,8 @@ expect class Buffer() : BufferedSource, BufferedSink { override fun write(byteString: ByteString): Buffer + override fun write(byteString: ByteString, offset: Int, byteCount: Int): Buffer + override fun writeUtf8(string: String): Buffer override fun writeUtf8(string: String, beginIndex: Int, endIndex: Int): Buffer diff --git a/okio/src/commonMain/kotlin/okio/BufferedSink.kt b/okio/src/commonMain/kotlin/okio/BufferedSink.kt index cf66f1179f..40c26585c8 100644 --- a/okio/src/commonMain/kotlin/okio/BufferedSink.kt +++ b/okio/src/commonMain/kotlin/okio/BufferedSink.kt @@ -25,6 +25,8 @@ expect interface BufferedSink : Sink { fun write(byteString: ByteString): BufferedSink + fun write(byteString: ByteString, offset: Int, byteCount: Int): BufferedSink + /** Like [OutputStream.write], this writes a complete byte array to this sink. */ fun write(source: ByteArray): BufferedSink diff --git a/okio/src/commonMain/kotlin/okio/ByteString.kt b/okio/src/commonMain/kotlin/okio/ByteString.kt index 7ef9792ea2..4e52882701 100644 --- a/okio/src/commonMain/kotlin/okio/ByteString.kt +++ b/okio/src/commonMain/kotlin/okio/ByteString.kt @@ -96,7 +96,7 @@ internal constructor(data: ByteArray) : Comparable { fun toByteArray(): ByteArray /** Writes the contents of this byte string to `buffer`. */ - internal fun write(buffer: Buffer) + internal fun write(buffer: Buffer, offset: Int, byteCount: Int) /** Returns the bytes of this string without a defensive copy. Do not mutate! */ internal fun internalArray(): ByteArray diff --git a/okio/src/commonMain/kotlin/okio/internal/Buffer.kt b/okio/src/commonMain/kotlin/okio/internal/Buffer.kt index b95c81d6d1..c7c615337e 100644 --- a/okio/src/commonMain/kotlin/okio/internal/Buffer.kt +++ b/okio/src/commonMain/kotlin/okio/internal/Buffer.kt @@ -417,8 +417,12 @@ internal inline fun Buffer.commonSkip(byteCount: Long) { } } -internal inline fun Buffer.commonWrite(byteString: ByteString): Buffer { - byteString.write(this) +internal inline fun Buffer.commonWrite( + byteString: ByteString, + offset: Int = 0, + byteCount: Int = byteString.size +): Buffer { + byteString.write(this, offset, byteCount) return this } diff --git a/okio/src/commonMain/kotlin/okio/internal/ByteString.kt b/okio/src/commonMain/kotlin/okio/internal/ByteString.kt index 4bbbbb291a..8982b2870b 100644 --- a/okio/src/commonMain/kotlin/okio/internal/ByteString.kt +++ b/okio/src/commonMain/kotlin/okio/internal/ByteString.kt @@ -283,8 +283,8 @@ internal inline fun String.commonDecodeHex(): ByteString { } /** Writes the contents of this byte string to `buffer`. */ -internal fun ByteString.commonWrite(buffer: Buffer) { - buffer.write(data, 0, data.size) +internal fun ByteString.commonWrite(buffer: Buffer, offset: Int, byteCount: Int) { + buffer.write(data, offset, byteCount) } private fun decodeHexDigit(c: Char): Int { diff --git a/okio/src/commonMain/kotlin/okio/internal/SegmentedByteString.kt b/okio/src/commonMain/kotlin/okio/internal/SegmentedByteString.kt index ae60925c9d..a1b2d8113a 100644 --- a/okio/src/commonMain/kotlin/okio/internal/SegmentedByteString.kt +++ b/okio/src/commonMain/kotlin/okio/internal/SegmentedByteString.kt @@ -147,8 +147,8 @@ internal inline fun SegmentedByteString.commonToByteArray(): ByteArray { return result } -internal inline fun SegmentedByteString.commonWrite(buffer: Buffer) { - forEachSegment { data, offset, byteCount -> +internal inline fun SegmentedByteString.commonWrite(buffer: Buffer, offset: Int, byteCount: Int) { + forEachSegment(offset, offset + byteCount) { data, offset, byteCount -> val segment = Segment(data, offset, offset + byteCount, true, false) if (buffer.head == null) { segment.prev = segment diff --git a/okio/src/jsMain/kotlin/okio/Buffer.kt b/okio/src/jsMain/kotlin/okio/Buffer.kt index f41d7cce5a..7360ded8e1 100644 --- a/okio/src/jsMain/kotlin/okio/Buffer.kt +++ b/okio/src/jsMain/kotlin/okio/Buffer.kt @@ -156,6 +156,9 @@ actual class Buffer : BufferedSource, BufferedSink { actual override fun write(byteString: ByteString): Buffer = commonWrite(byteString) + actual override fun write(byteString: ByteString, offset: Int, byteCount: Int) = + commonWrite(byteString, offset, byteCount) + internal actual fun writableSegment(minimumCapacity: Int): Segment = commonWritableSegment(minimumCapacity) diff --git a/okio/src/jsMain/kotlin/okio/BufferedSink.kt b/okio/src/jsMain/kotlin/okio/BufferedSink.kt index 02fdfa4e0c..65d717c60a 100644 --- a/okio/src/jsMain/kotlin/okio/BufferedSink.kt +++ b/okio/src/jsMain/kotlin/okio/BufferedSink.kt @@ -20,6 +20,8 @@ actual interface BufferedSink : Sink { actual fun write(byteString: ByteString): BufferedSink + actual fun write(byteString: ByteString, offset: Int, byteCount: Int): BufferedSink + actual fun write(source: ByteArray): BufferedSink actual fun write(source: ByteArray, offset: Int, byteCount: Int): BufferedSink diff --git a/okio/src/jsMain/kotlin/okio/ByteString.kt b/okio/src/jsMain/kotlin/okio/ByteString.kt index 81c882d04f..0c17992c84 100644 --- a/okio/src/jsMain/kotlin/okio/ByteString.kt +++ b/okio/src/jsMain/kotlin/okio/ByteString.kt @@ -111,7 +111,8 @@ internal actual constructor( /** Returns the bytes of this string without a defensive copy. Do not mutate! */ internal actual open fun internalArray() = commonInternalArray() - internal actual open fun write(buffer: Buffer) = commonWrite(buffer) + internal actual open fun write(buffer: Buffer, offset: Int, byteCount: Int) = + commonWrite(buffer, offset, byteCount) /** * Returns true if the bytes of this in `[offset..offset+byteCount)` equal the bytes of `other` in diff --git a/okio/src/jsMain/kotlin/okio/SegmentedByteString.kt b/okio/src/jsMain/kotlin/okio/SegmentedByteString.kt index 711808ceee..707535476d 100644 --- a/okio/src/jsMain/kotlin/okio/SegmentedByteString.kt +++ b/okio/src/jsMain/kotlin/okio/SegmentedByteString.kt @@ -73,7 +73,8 @@ internal actual class SegmentedByteString internal actual constructor( override fun toByteArray(): ByteArray = commonToByteArray() - override fun write(buffer: Buffer): Unit = commonWrite(buffer) + override fun write(buffer: Buffer, offset: Int, byteCount: Int): Unit = + commonWrite(buffer, offset, byteCount) override fun rangeEquals( offset: Int, diff --git a/okio/src/jvmMain/kotlin/okio/Buffer.kt b/okio/src/jvmMain/kotlin/okio/Buffer.kt index d19ceb123a..b0ba680189 100644 --- a/okio/src/jvmMain/kotlin/okio/Buffer.kt +++ b/okio/src/jvmMain/kotlin/okio/Buffer.kt @@ -367,6 +367,9 @@ actual class Buffer : BufferedSource, BufferedSink, Cloneable, ByteChannel { actual override fun write(byteString: ByteString): Buffer = commonWrite(byteString) + actual override fun write(byteString: ByteString, offset: Int, byteCount: Int) = + commonWrite(byteString, offset, byteCount) + actual override fun writeUtf8(string: String): Buffer = writeUtf8(string, 0, string.length) actual override fun writeUtf8(string: String, beginIndex: Int, endIndex: Int): Buffer = diff --git a/okio/src/jvmMain/kotlin/okio/BufferedSink.kt b/okio/src/jvmMain/kotlin/okio/BufferedSink.kt index 3757a9a045..edb632f910 100644 --- a/okio/src/jvmMain/kotlin/okio/BufferedSink.kt +++ b/okio/src/jvmMain/kotlin/okio/BufferedSink.kt @@ -33,6 +33,9 @@ actual interface BufferedSink : Sink, WritableByteChannel { @Throws(IOException::class) actual fun write(byteString: ByteString): BufferedSink + @Throws(IOException::class) + actual fun write(byteString: ByteString, offset: Int, byteCount: Int): BufferedSink + @Throws(IOException::class) actual fun write(source: ByteArray): BufferedSink diff --git a/okio/src/jvmMain/kotlin/okio/ByteString.kt b/okio/src/jvmMain/kotlin/okio/ByteString.kt index b39fbd7a46..b65d0b9103 100644 --- a/okio/src/jvmMain/kotlin/okio/ByteString.kt +++ b/okio/src/jvmMain/kotlin/okio/ByteString.kt @@ -140,7 +140,8 @@ internal actual constructor( out.write(data) } - internal actual open fun write(buffer: Buffer) = commonWrite(buffer) + internal actual open fun write(buffer: Buffer, offset: Int, byteCount: Int) = + commonWrite(buffer, offset, byteCount) actual open fun rangeEquals( offset: Int, diff --git a/okio/src/jvmMain/kotlin/okio/RealBufferedSink.kt b/okio/src/jvmMain/kotlin/okio/RealBufferedSink.kt index 4160ce1c01..6b80ff1ff4 100644 --- a/okio/src/jvmMain/kotlin/okio/RealBufferedSink.kt +++ b/okio/src/jvmMain/kotlin/okio/RealBufferedSink.kt @@ -45,6 +45,12 @@ internal class RealBufferedSink( return emitCompleteSegments() } + override fun write(byteString: ByteString, offset: Int, byteCount: Int): BufferedSink { + check(!closed) { "closed" } + buffer.write(byteString, offset, byteCount) + return emitCompleteSegments() + } + override fun writeUtf8(string: String): BufferedSink { check(!closed) { "closed" } buffer.writeUtf8(string) diff --git a/okio/src/jvmMain/kotlin/okio/SegmentedByteString.kt b/okio/src/jvmMain/kotlin/okio/SegmentedByteString.kt index a4fef3631c..00aba1a273 100644 --- a/okio/src/jvmMain/kotlin/okio/SegmentedByteString.kt +++ b/okio/src/jvmMain/kotlin/okio/SegmentedByteString.kt @@ -114,7 +114,8 @@ internal actual class SegmentedByteString internal actual constructor( } } - override fun write(buffer: Buffer): Unit = commonWrite(buffer) + override fun write(buffer: Buffer, offset: Int, byteCount: Int): Unit = + commonWrite(buffer, offset, byteCount) override fun rangeEquals( offset: Int, diff --git a/okio/src/jvmTest/java/okio/BufferedSinkTest.java b/okio/src/jvmTest/java/okio/BufferedSinkTest.java index 222449a737..8bbf8f24d7 100644 --- a/okio/src/jvmTest/java/okio/BufferedSinkTest.java +++ b/okio/src/jvmTest/java/okio/BufferedSinkTest.java @@ -165,6 +165,18 @@ public static List parameters() { assertEquals("[hex=2143658701efcdab005cb1b0bebafeca]", data.toString()); } + @Test public void writeByteString() throws IOException { + sink.write(ByteString.encodeUtf8("təˈranəˌsôr")); + sink.flush(); + assertEquals(ByteString.decodeHex("74c999cb8872616ec999cb8c73c3b472"), data.readByteString()); + } + + @Test public void writeByteStringOffset() throws IOException { + sink.write(ByteString.encodeUtf8("təˈranəˌsôr"), 5, 5); + sink.flush(); + assertEquals(ByteString.decodeHex("72616ec999"), data.readByteString()); + } + @Test public void writeStringUtf8() throws IOException { sink.writeUtf8("təˈranəˌsôr"); sink.flush(); diff --git a/okio/src/nativeMain/kotlin/okio/Buffer.kt b/okio/src/nativeMain/kotlin/okio/Buffer.kt index 84f5139f4f..52cb2d3630 100644 --- a/okio/src/nativeMain/kotlin/okio/Buffer.kt +++ b/okio/src/nativeMain/kotlin/okio/Buffer.kt @@ -156,6 +156,9 @@ actual class Buffer : BufferedSource, BufferedSink { actual override fun write(byteString: ByteString): Buffer = commonWrite(byteString) + actual override fun write(byteString: ByteString, offset: Int, byteCount: Int) = + commonWrite(byteString, offset, byteCount) + actual override fun writeUtf8(string: String): Buffer = writeUtf8(string, 0, string.length) internal actual fun writableSegment(minimumCapacity: Int): Segment = diff --git a/okio/src/nativeMain/kotlin/okio/BufferedSink.kt b/okio/src/nativeMain/kotlin/okio/BufferedSink.kt index 02fdfa4e0c..65d717c60a 100644 --- a/okio/src/nativeMain/kotlin/okio/BufferedSink.kt +++ b/okio/src/nativeMain/kotlin/okio/BufferedSink.kt @@ -20,6 +20,8 @@ actual interface BufferedSink : Sink { actual fun write(byteString: ByteString): BufferedSink + actual fun write(byteString: ByteString, offset: Int, byteCount: Int): BufferedSink + actual fun write(source: ByteArray): BufferedSink actual fun write(source: ByteArray, offset: Int, byteCount: Int): BufferedSink diff --git a/okio/src/nativeMain/kotlin/okio/ByteString.kt b/okio/src/nativeMain/kotlin/okio/ByteString.kt index 4b0f3e09f5..bddaf2f7bb 100644 --- a/okio/src/nativeMain/kotlin/okio/ByteString.kt +++ b/okio/src/nativeMain/kotlin/okio/ByteString.kt @@ -109,7 +109,8 @@ internal actual constructor( /** Returns the bytes of this string without a defensive copy. Do not mutate! */ internal actual open fun internalArray() = commonInternalArray() - internal actual open fun write(buffer: Buffer) = commonWrite(buffer) + internal actual open fun write(buffer: Buffer, offset: Int, byteCount: Int) = + commonWrite(buffer, offset, byteCount) /** * Returns true if the bytes of this in `[offset..offset+byteCount)` equal the bytes of `other` in diff --git a/okio/src/nativeMain/kotlin/okio/SegmentedByteString.kt b/okio/src/nativeMain/kotlin/okio/SegmentedByteString.kt index 711808ceee..707535476d 100644 --- a/okio/src/nativeMain/kotlin/okio/SegmentedByteString.kt +++ b/okio/src/nativeMain/kotlin/okio/SegmentedByteString.kt @@ -73,7 +73,8 @@ internal actual class SegmentedByteString internal actual constructor( override fun toByteArray(): ByteArray = commonToByteArray() - override fun write(buffer: Buffer): Unit = commonWrite(buffer) + override fun write(buffer: Buffer, offset: Int, byteCount: Int): Unit = + commonWrite(buffer, offset, byteCount) override fun rangeEquals( offset: Int,