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',
  );
}