fill(start: int, length: int, value: int) - > ()- Модуль
- std.
bytes → - Получатель
- Byte
Buffer - Минимальное число аргументов
- 3
- Максимальное число аргументов
- 3
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
СсылкаReplace a complete in-range region with one byte value. Validate the whole region before writing and return unit.
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)
Нет стандартного вывода.Ожидаемый результат
Ожидаемый результат
Этап отклонения run. Ненулевой код завершения.
byte-buffer-index-bounds at
main.tpz:3:1
Reject a negative write index
Ссылкаimport std.bytes { ByteBuffer }let mut buffer = ByteBuffer.allocate(2)buffer.set(-1, 0)
Нет стандартного вывода.Ожидаемый результат
Ожидаемый результат
Этап отклонения run. Ненулевой код завершения.
byte-buffer-negative-bound at
main.tpz:3:1
Reject a fill whose complete region does not fit
Ссылкаimport std.bytes { ByteBuffer }let mut buffer = ByteBuffer.allocate(2)buffer.fill(1, 2, 0)
Нет стандартного вывода.Ожидаемый результат
Ожидаемый результат
Этап отклонения run. Ненулевой код завершения.
byte-buffer-region-bounds at
main.tpz:3:1
Reject an empty copy beyond the buffer end
Ссылкаimport std.bytes { ByteBuffer }let mut buffer = ByteBuffer.allocate(2)buffer.copy(buffer, 3, 2, 0)
Нет стандартного вывода.Ожидаемый результат
Ожидаемый результат
Этап отклонения run. Ненулевой код завершения.
byte-buffer-region-bounds at
main.tpz:3:1
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")
Нет стандартного вывода.Ожидаемый результат
Ожидаемый результат
Этап отклонения run. Ненулевой код завершения.
byte-buffer-byte-value at
main.tpz:4:1
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")
Нет стандартного вывода.Ожидаемый результат
Ожидаемый результат
Этап отклонения run. Ненулевой код завершения.
byte-buffer-byte-value at
main.tpz:4:1