put method

void put(
  1. int number,
  2. int length
)

Implementation

void put(int number, int length) {
  if (length == 0) return;

  assert(length > 0, "length must be strictly positive");
  assert(number >= 0, "number must be non-negative");

  int bitIndex = _length;
  final int endBitIndex = bitIndex + length;

  final int neededBytes = (endBitIndex + 7) >> 3;
  _ensureCapacity(neededBytes);

  if (length == 8 && (bitIndex & 7) == 0 && number >= 0 && number <= 255) {
    _buffer[bitIndex >> 3] = number;
    _length = endBitIndex;
    return;
  }

  int bitsLeft = length;

  while (bitsLeft > 0) {
    final int bufIndex = bitIndex >> 3;
    final int leftBitIndex = bitIndex & 7;
    final int available = 8 - leftBitIndex;
    final int bitsToWrite = bitsLeft < available ? bitsLeft : available;

    final int shift = bitsLeft - bitsToWrite;
    final int bits = (number >> shift) & ((1 << bitsToWrite) - 1);

    final int posShift = 8 - leftBitIndex - bitsToWrite;
    _buffer[bufIndex] |= bits << posShift;

    bitsLeft -= bitsToWrite;
    bitIndex += bitsToWrite;
  }

  _length = endBitIndex;
}