copy(source: Byte Buffer, source Start: int, target Start: int, length: int) - > ()- 수신자
- Byte
Buffer - 최소 인자 수
- 4
- 최대 인자 수
- 4
Declaration and parameters
링크사용 조건
기본 포함 · 미정
Import std.bytes in language mode 5.21.
The current compiler selects std/bytes.tpz for this language mode. Availability in other released editions and inclusion in each installed distribution are Pending.
수신자
ByteBuffer
매개변수 제약
ByteBuffer.get and ByteBuffer.set use zero-based byte indices from zero through length minus one. Get returns an int byte.
ByteBuffer.set replaces one byte. ByteBuffer.fill replaces length bytes beginning at start. Both require values from 0 through 255.
ByteBuffer.copy receives the source buffer, sourceStart, targetStart, and length in that order. The receiver is the destination.
Fill and copy use byte intervals from each start to start plus length. Starts and lengths must be nonnegative. Every complete source and destination interval must fit its buffer without arithmetic overflow.
A zero length region at the end of a buffer is valid. A start beyond the end is invalid even when length is zero.
Copy observes the source interval before its first destination write. Copying within one buffer therefore supports overlap in either direction.
Set, fill, and copy return unit. They require a let mut root binding and update its destination value under collection value semantics.
The receiver and supplied arguments evaluate once from left to right. Every range and byte check finishes before the first write.
An invalid index or region produces TPZ4001 at runtime. An invalid byte value produces TPZ5001 at runtime, including a fill of zero bytes.
A rejected operation performs no buffer writes. Effects performed while evaluating its receiver or arguments remain visible.
When several preconditions fail, the selected failing precondition is unspecified. The operation still completes every argument evaluation before validation and performs no writes.
관련 규칙 · Validate buffer regions before writing →결과
The declared result type is ().
효과
실패
Result and effects
링크Copy a source region into the receiver after validating both intervals. Observe source bytes before overlapping destination writes.
Resolved contracts
링크Related entries
링크Validate buffer regions before writing
링크Validate buffer regions before writing
ByteBuffer.get and ByteBuffer.set use zero-based byte indices from zero through length minus one. Get returns an int byte.
ByteBuffer.set replaces one byte. ByteBuffer.fill replaces length bytes beginning at start. Both require values from 0 through 255.
ByteBuffer.copy receives the source buffer, sourceStart, targetStart, and length in that order. The receiver is the destination.
Fill and copy use byte intervals from each start to start plus length. Starts and lengths must be nonnegative. Every complete source and destination interval must fit its buffer without arithmetic overflow.
A zero length region at the end of a buffer is valid. A start beyond the end is invalid even when length is zero.
Copy observes the source interval before its first destination write. Copying within one buffer therefore supports overlap in either direction.
Set, fill, and copy return unit. They require a let mut root binding and update its destination value under collection value semantics.
The receiver and supplied arguments evaluate once from left to right. Every range and byte check finishes before the first write.
An invalid index or region produces TPZ4001 at runtime. An invalid byte value produces TPZ5001 at runtime, including a fill of zero bytes.
A rejected operation performs no buffer writes. Effects performed while evaluating its receiver or arguments remain visible.
When several preconditions fail, the selected failing precondition is unspecified. The operation still completes every argument evaluation before validation and performs no writes.
이유
Checking complete regions prevents a malformed count from leaving half-written data. Reading the source interval before writing gives one result for every overlap direction.
Copy overlapping regions and preserve an earlier buffer value
링크import std.bytes { Bytes, ByteBuffer }import std.ioimport std.testlet mut buffer = ByteBuffer.fromBytes(test.assertOk(Bytes.fromHex("000102030405")))let alias = bufferbuffer.copy(buffer, 0, 1, 5)io.writeLine(buffer.toBytes().toHex())buffer.fill(2, 2, 255)buffer.set(0, 128)io.writeLine(buffer.toBytes().toHex())buffer.copy(buffer, 1, 0, 5)buffer.fill(6, 0, 0)buffer.copy(buffer, 6, 6, 0)io.writeLine(buffer.toBytes().toHex())io.writeLine(alias.toBytes().toHex())io.writeLine("{alias.get(0)}")
000001020304
8000ffff0304
00ffff030404
000102030405
0
기대 결과
기대 결과
실행을 마칩니다. 종료 코드 0.
0000010203048000ffff030400ffff0304040001020304050
Keep an independent source buffer unchanged
링크import std.bytes { ByteBuffer }import std.iolet source = ByteBuffer.fromBytes("abc".encodeUtf8())let mut target = ByteBuffer.allocate(4, 0)target.copy(source, 1, 1, 2)io.writeLine(target.toBytes().toHex())io.writeLine(source.toBytes().toHex())
00626300
616263
기대 결과
기대 결과
실행을 마칩니다. 종료 코드 0.
00626300616263
Reject a read at the exclusive end
링크import std.bytes { ByteBuffer }let buffer = ByteBuffer.allocate(2)buffer.get(2)
표준 출력 없음.기대 결과
Reject a negative write index
링크import std.bytes { ByteBuffer }let mut buffer = ByteBuffer.allocate(2)buffer.set(-1, 0)
표준 출력 없음.기대 결과
Reject a fill whose complete region does not fit
링크import std.bytes { ByteBuffer }let mut buffer = ByteBuffer.allocate(2)buffer.fill(1, 2, 0)
표준 출력 없음.기대 결과
Reject an empty copy beyond the buffer end
링크import std.bytes { ByteBuffer }let mut buffer = ByteBuffer.allocate(2)buffer.copy(buffer, 3, 2, 0)
표준 출력 없음.기대 결과
Reject an invalid byte at a valid write index
링크import std.bytes { ByteBuffer }import std.iolet mut buffer = ByteBuffer.allocate(1)buffer.set(0, -1)io.writeLine("after")
표준 출력 없음.기대 결과
Validate the byte for a fill of zero bytes
링크import std.bytes { ByteBuffer }import std.iolet mut buffer = ByteBuffer.allocate(1)buffer.fill(1, 0, 256)io.writeLine("after")
표준 출력 없음.