Перейти к содержимому
Топаз6.0 · До релиза
Загрузка →

Поиск в документации

Спецификация 6.0

Выберите результат стрелками и нажмите Enter, чтобы открыть его.

Введите имя API, номер диагностики, правило или тему проекта.

    Библиотека · std.bytes

    ByteBuffer.copy

    Copies bytes from a source buffer into this buffer.

    copy(source: ByteBuffer, sourceStart: int, targetStart: int, length: int) -> ()
    Модуль
    std.bytes →
    Получатель
    ByteBuffer
    Минимальное число аргументов
    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.

    Результат

    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

    Ссылка

    std.bytes →

    Validate buffer regions before writing

    Ссылка
    Правилоtopaz.stdlib.contract.byte-buffer-mutation.rule

    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

    Ссылка
    main.tpzCopy overlapping regions and preserve an earlier buffer valueОткрыть песочницу →
    1. import std.bytes { Bytes, ByteBuffer }
    2. import std.io
    3. import std.test
    4. let mut buffer = ByteBuffer.fromBytes(test.assertOk(Bytes.fromHex("000102030405")))
    5. let alias = buffer
    6. buffer.copy(buffer, 0, 1, 5)
    7. io.writeLine(buffer.toBytes().toHex())
    8. buffer.fill(2, 2, 255)
    9. buffer.set(0, 128)
    10. io.writeLine(buffer.toBytes().toHex())
    11. buffer.copy(buffer, 1, 0, 5)
    12. buffer.fill(6, 0, 0)
    13. buffer.copy(buffer, 6, 6, 0)
    14. io.writeLine(buffer.toBytes().toHex())
    15. io.writeLine(alias.toBytes().toHex())
    16. io.writeLine("{alias.get(0)}")
    Ожидаемый выводКод завершения 0
    000001020304
    8000ffff0304
    00ffff030404
    000102030405
    0
    
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. 000001020304
    2. 8000ffff0304
    3. 00ffff030404
    4. 000102030405
    5. 0

    Keep an independent source buffer unchanged

    Ссылка
    main.tpzKeep an independent source buffer unchangedОткрыть песочницу →
    1. import std.bytes { ByteBuffer }
    2. import std.io
    3. let source = ByteBuffer.fromBytes("abc".encodeUtf8())
    4. let mut target = ByteBuffer.allocate(4, 0)
    5. target.copy(source, 1, 1, 2)
    6. io.writeLine(target.toBytes().toHex())
    7. io.writeLine(source.toBytes().toHex())
    Ожидаемый выводКод завершения 0
    00626300
    616263
    
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. 00626300
    2. 616263

    Reject a read at the exclusive end

    Ссылка
    main.tpzReject a read at the exclusive endОткрыть песочницу →
    1. import std.bytes { ByteBuffer }
    2. let buffer = ByteBuffer.allocate(2)
    3. buffer.get(2)
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения run. Ненулевой код завершения.

    Reject a negative write index

    Ссылка
    main.tpzReject a negative write indexОткрыть песочницу →
    1. import std.bytes { ByteBuffer }
    2. let mut buffer = ByteBuffer.allocate(2)
    3. buffer.set(-1, 0)
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения run. Ненулевой код завершения.

    Reject a fill whose complete region does not fit

    Ссылка
    main.tpzReject a fill whose complete region does not fitОткрыть песочницу →
    1. import std.bytes { ByteBuffer }
    2. let mut buffer = ByteBuffer.allocate(2)
    3. buffer.fill(1, 2, 0)
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения run. Ненулевой код завершения.

    Reject an empty copy beyond the buffer end

    Ссылка
    main.tpzReject an empty copy beyond the buffer endОткрыть песочницу →
    1. import std.bytes { ByteBuffer }
    2. let mut buffer = ByteBuffer.allocate(2)
    3. buffer.copy(buffer, 3, 2, 0)
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения run. Ненулевой код завершения.

    Reject an invalid byte at a valid write index

    Ссылка
    main.tpzReject an invalid byte at a valid write indexОткрыть песочницу →
    1. import std.bytes { ByteBuffer }
    2. import std.io
    3. let mut buffer = ByteBuffer.allocate(1)
    4. buffer.set(0, -1)
    5. io.writeLine("after")
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения run. Ненулевой код завершения.

    Validate the byte for a fill of zero bytes

    Ссылка
    main.tpzValidate the byte for a fill of zero bytesОткрыть песочницу →
    1. import std.bytes { ByteBuffer }
    2. import std.io
    3. let mut buffer = ByteBuffer.allocate(1)
    4. buffer.fill(1, 0, 256)
    5. io.writeLine("after")
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения run. Ненулевой код завершения.

    Diagnostics

    Ссылка

    Index out of bounds →

    Runtime value guard →

    Меню

    Загрузка →