Skip to content

Commit 9ab60cf

Browse files
author
Sergey Mashkov
committed
IO: add ByteWritePacket.writePacket
1 parent f946266 commit 9ab60cf

File tree

4 files changed

+49
-0
lines changed

4 files changed

+49
-0
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ interface ByteWritePacket : Appendable {
2828
fun outputStream(): OutputStream
2929
fun writerUTF8(): Writer
3030

31+
fun writePacket(p: ByteReadPacket)
32+
3133
override fun append(csq: CharSequence): ByteWritePacket {
3234
append(csq, 0, csq.length)
3335
return this

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,22 @@ internal class ByteWritePacketImpl(private val pool: ObjectPool<ByteBuffer>) : B
8383
return this
8484
}
8585

86+
override fun writePacket(p: ByteReadPacket) {
87+
when (p) {
88+
is ByteReadPacketEmpty -> {}
89+
is ByteReadPacketSingle -> {
90+
if (p.remaining > 0) {
91+
last(p.steal().also { it.compact() })
92+
}
93+
}
94+
is ByteReadPacketImpl -> {
95+
while (p.remaining > 0) {
96+
last(p.steal().also { it.compact() })
97+
}
98+
}
99+
}
100+
}
101+
86102
private tailrec fun appendASCII(csq: CharSequence, start: Int, end: Int) {
87103
val bb = ensure()
88104
val limitedEnd = minOf(end, start + bb.remaining())

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ private val PACKET_BUFFER_POOL_SIZE = getIOIntProperty("PacketBufferPoolSize", 1
99
private val PacketBufferPool: ObjectPool<ByteBuffer> =
1010
object : ObjectPoolImpl<ByteBuffer>(PACKET_BUFFER_POOL_SIZE) {
1111
override fun produceInstance(): ByteBuffer = ByteBuffer.allocateDirect(PACKET_BUFFER_SIZE)
12+
override fun clearInstance(instance: ByteBuffer) = instance.apply { clear() }
1213
}
1314

1415
inline fun buildPacket(block: ByteWritePacket.() -> Unit): ByteReadPacket =

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,4 +305,34 @@ class BytePacketReaderWriterTest {
305305

306306
assertTrue { bytes.contentEquals(copied) }
307307
}
308+
309+
@Test
310+
fun testWritePacketSingle() {
311+
val inner = buildPacket {
312+
append("ABC")
313+
}
314+
315+
val outer = buildPacket {
316+
append("123")
317+
writePacket(inner)
318+
append(".")
319+
}
320+
321+
assertEquals("123ABC.", outer.readText().toString())
322+
}
323+
324+
@Test
325+
fun testWritePacketMultiple() {
326+
val inner = buildPacket {
327+
append("o".repeat(100000))
328+
}
329+
330+
val outer = buildPacket {
331+
append("123")
332+
writePacket(inner)
333+
append(".")
334+
}
335+
336+
assertEquals("123" + "o".repeat(100000) + ".", outer.readText().toString())
337+
}
308338
}

0 commit comments

Comments
 (0)