Skip to content

Commit 8b23c56

Browse files
author
Sergey Mashkov
committed
IO: add ByteWritePacket.writePacketUnconsumed
1 parent 9ab60cf commit 8b23c56

File tree

5 files changed

+57
-7
lines changed

5 files changed

+57
-7
lines changed

core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/packet/ByteReadPacketImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import java.nio.*
88
import java.nio.charset.*
99
import java.util.*
1010

11-
internal class ByteReadPacketImpl(private val packets: ArrayDeque<ByteBuffer>, internal val pool: ObjectPool<ByteBuffer>) : ByteReadPacket {
11+
internal class ByteReadPacketImpl(internal val packets: ArrayDeque<ByteBuffer>, internal val pool: ObjectPool<ByteBuffer>) : ByteReadPacket {
1212
override val remaining: Int
1313
get() = packets.sumBy { it.remaining() }
1414

core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/packet/ByteReadPacketSingle.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package kotlinx.coroutines.experimental.io.packet
22

3-
import kotlinx.coroutines.experimental.io.*
4-
import kotlinx.coroutines.experimental.io.internal.ObjectPool
5-
import kotlinx.coroutines.experimental.io.internal.decodeUTF8
3+
import kotlinx.coroutines.experimental.io.internal.*
64
import java.io.*
7-
import java.nio.BufferOverflowException
8-
import java.nio.ByteBuffer
5+
import java.nio.*
96
import java.nio.charset.*
107

11-
internal class ByteReadPacketSingle(private var buffer: ByteBuffer?, internal val pool: ObjectPool<ByteBuffer>) : ByteReadPacket {
8+
internal class ByteReadPacketSingle(internal var buffer: ByteBuffer?, internal val pool: ObjectPool<ByteBuffer>) : ByteReadPacket {
129
override val remaining: Int
1310
get() = buffer?.remaining() ?: 0
1411

core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/packet/ByteWritePacket.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ interface ByteWritePacket : Appendable {
2929
fun writerUTF8(): Writer
3030

3131
fun writePacket(p: ByteReadPacket)
32+
fun writePacketUnconsumed(p: ByteReadPacket)
3233

3334
override fun append(csq: CharSequence): ByteWritePacket {
3435
append(csq, 0, csq.length)

core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/packet/ByteWritePacketImpl.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,24 @@ internal class ByteWritePacketImpl(private val pool: ObjectPool<ByteBuffer>) : B
9696
last(p.steal().also { it.compact() })
9797
}
9898
}
99+
else -> {
100+
writeFully(p.readBytes())
101+
}
102+
}
103+
}
104+
105+
override fun writePacketUnconsumed(p: ByteReadPacket) {
106+
when (p) {
107+
is ByteReadPacketEmpty -> {}
108+
is ByteReadPacketSingle -> {
109+
p.buffer?.duplicate()?.let { writeFully(it) }
110+
}
111+
is ByteReadPacketImpl -> {
112+
for (buffer in p.packets) {
113+
writeFully(buffer.duplicate())
114+
}
115+
}
116+
else -> throw UnsupportedOperationException()
99117
}
100118
}
101119

core/kotlinx-coroutines-io/src/test/kotlin/kotlinx/coroutines/experimental/io/BytePacketReaderWriterTest.kt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ class BytePacketReaderWriterTest {
319319
}
320320

321321
assertEquals("123ABC.", outer.readText().toString())
322+
assertEquals(0, inner.remaining)
322323
}
323324

324325
@Test
@@ -334,5 +335,38 @@ class BytePacketReaderWriterTest {
334335
}
335336

336337
assertEquals("123" + "o".repeat(100000) + ".", outer.readText().toString())
338+
assertEquals(0, inner.remaining)
339+
}
340+
341+
@Test
342+
fun testWritePacketSingleUnconsumed() {
343+
val inner = buildPacket {
344+
append("ABC")
345+
}
346+
347+
val outer = buildPacket {
348+
append("123")
349+
writePacketUnconsumed(inner)
350+
append(".")
351+
}
352+
353+
assertEquals("123ABC.", outer.readText().toString())
354+
assertEquals(3, inner.remaining)
355+
}
356+
357+
@Test
358+
fun testWritePacketMultipleUnconsumed() {
359+
val inner = buildPacket {
360+
append("o".repeat(100000))
361+
}
362+
363+
val outer = buildPacket {
364+
append("123")
365+
writePacketUnconsumed(inner)
366+
append(".")
367+
}
368+
369+
assertEquals("123" + "o".repeat(100000) + ".", outer.readText().toString())
370+
assertEquals(100000, inner.remaining)
337371
}
338372
}

0 commit comments

Comments
 (0)