length property

int length

Returns the length of the underlying FlexBuffer value. If the underlying value is null the length is 0. If the underlying value is a number, or a bool, the length is 1. If the underlying value is a vector, or map, the length reflects number of elements / element pairs. If the values is a string or a blob, the length reflects a number of bytes the value occupies (strings are encoded in utf8 format).

Implementation

int get length {
  if (_length == null) {
    // needs to be checked before more generic isAVector
    if (ValueTypeUtils.isFixedTypedVector(_valueType)) {
      _length = ValueTypeUtils.fixedTypedVectorElementSize(_valueType);
    } else if (_valueType == ValueType.Blob ||
        ValueTypeUtils.isAVector(_valueType) ||
        _valueType == ValueType.Map) {
      _length = _readUInt(
          _indirect - _byteWidth, BitWidthUtil.fromByteWidth(_byteWidth));
    } else if (_valueType == ValueType.Null) {
      _length = 0;
    } else if (_valueType == ValueType.String) {
      final indirect = _indirect;
      var sizeByteWidth = _byteWidth;
      var size = _readUInt(indirect - sizeByteWidth,
          BitWidthUtil.fromByteWidth(sizeByteWidth));
      while (_buffer.getInt8(indirect + size) != 0) {
        sizeByteWidth <<= 1;
        size = _readUInt(indirect - sizeByteWidth,
            BitWidthUtil.fromByteWidth(sizeByteWidth));
      }
      _length = size;
    } else if (_valueType == ValueType.Key) {
      final indirect = _indirect;
      var size = 1;
      while (_buffer.getInt8(indirect + size) != 0) {
        size += 1;
      }
      _length = size;
    } else {
      _length = 1;
    }
  }
  return _length!;
}