writeTo method

bool writeTo(
  1. Uint8List buffer, [
  2. int offset = 0
])

Serializes everything written to this writer so far to buffer, starting from offset in buffer. Returns true on success.

Implementation

bool writeTo(Uint8List buffer, [int offset = 0]) {
  if (buffer.length - offset < _bytesTotal) {
    return false;
  }

  // Move the current output chunk into _outputChunks and commit the current
  // splice for uniformity.
  _commitChunk(false);
  _commitSplice();

  var outPos = offset; // Output position in the buffer.
  var chunkIndex = 0, chunkPos = 0; // Position within _outputChunks.
  for (var i = 0; i < _splices.length; i++) {
    final action = _splices[i];
    if (action is int) {
      if (action <= 0) {
        // action is a positive varint to be emitted into the output buffer.
        var v = 0 - action; // Note: 0 - action to avoid -0.0 in JS.
        while (v >= 0x80) {
          buffer[outPos++] = 0x80 | (v & 0x7f);
          v >>= 7;
        }
        buffer[outPos++] = v;
      } else {
        // `action` is an amount of bytes to copy from `_outputChunks` into
        // the buffer.
        var bytesToCopy = action;
        while (bytesToCopy > 0) {
          final Uint8List chunk = _outputChunks[chunkIndex];
          final int bytesInChunk = _outputChunks[chunkIndex + 1];

          // Copy at most `bytesToCopy` bytes from the current chunk.
          final leftInChunk = bytesInChunk - chunkPos;
          final bytesToCopyFromChunk =
              leftInChunk > bytesToCopy ? bytesToCopy : leftInChunk;
          buffer.setRange(
            outPos,
            outPos + bytesToCopyFromChunk,
            chunk,
            chunkPos,
          );
          chunkPos += bytesToCopyFromChunk;
          outPos += bytesToCopyFromChunk;
          bytesToCopy -= bytesToCopyFromChunk;

          // Move to the next chunk if the current one is exhausted.
          if (chunkPos == bytesInChunk) {
            chunkIndex += 2;
            chunkPos = 0;
          }
        }
      }
    } else {
      // action is a `Uint8List` containing bytes to emit into the output
      // buffer.
      final Uint8List value = action;
      final end = outPos + value.length;
      buffer.setRange(outPos, end, value);
      outPos = end;
    }
  }

  return true;
}