operator [] method

Reference operator [](
  1. Object key
)

Can be used with an int or a String value for key. If the underlying value in FlexBuffer is a vector, then use int for access. If the underlying value in FlexBuffer is a map, then use String for access. Returns Reference value. Throws an exception when key is not applicable.

Implementation

Reference operator [](Object key) {
  if (key is int && ValueTypeUtils.isAVector(_valueType)) {
    final index = key;
    if (index >= length || index < 0) {
      throw ArgumentError(
          'Key: [$key] is not applicable on: $_path of: $_valueType length: $length');
    }
    final elementOffset = _indirect + index * _byteWidth;
    int packedType = 0;
    int? byteWidth;
    ValueType? valueType;
    if (ValueTypeUtils.isTypedVector(_valueType)) {
      byteWidth = 1;
      valueType = ValueTypeUtils.typedVectorElementType(_valueType);
    } else if (ValueTypeUtils.isFixedTypedVector(_valueType)) {
      byteWidth = 1;
      valueType = ValueTypeUtils.fixedTypedVectorElementType(_valueType);
    } else {
      packedType = _buffer.getUint8(_indirect + length * _byteWidth + index);
    }
    return Reference._(
        _buffer,
        elementOffset,
        BitWidthUtil.fromByteWidth(_byteWidth),
        packedType,
        "$_path[$index]",
        byteWidth,
        valueType);
  }
  if (key is String && _valueType == ValueType.Map) {
    final index = _keyIndex(key);
    if (index != null) {
      return _valueForIndexWithKey(index, key);
    }
  }
  throw ArgumentError(
      'Key: [$key] is not applicable on: $_path of: $_valueType');
}