blob: 0f2f73111dfabcc73267df377ae1e8665d791301 [file]
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:collection';
import 'package:ffi/ffi.dart';
import 'internal.dart';
import 'objective_c_bindings_generated.dart';
class NSArrayAdapter with Iterable<ObjCObjectBase> {
final NSArray array;
NSArrayAdapter(this.array);
@override
int get length => array.count;
@override
ObjCObjectBase elementAt(int index) => array.objectAtIndex(index);
@override
Iterator<ObjCObjectBase> get iterator => _NSArrayIterator(this);
ObjCObjectBase operator [](int index) => array.objectAtIndex(index);
}
class NSMutableArrayAdapter with ListBase<ObjCObjectBase> {
final NSMutableArray array;
NSMutableArrayAdapter(this.array);
@override
int get length => array.count;
@override
set length(int newLength) {
var len = length;
RangeError.checkValueInInterval(newLength, 0, len);
for (; len > newLength; --len) array.removeLastObject();
}
@override
ObjCObjectBase elementAt(int index) => array.objectAtIndex(index);
@override
Iterator<ObjCObjectBase> get iterator => _NSArrayIterator(this);
@override
ObjCObjectBase operator [](int index) => array.objectAtIndex(index);
@override
void operator []=(int index, ObjCObjectBase value) =>
array.replaceObjectAtIndex(index, withObject: value);
@override
void add(ObjCObjectBase value) => array.addObject(value);
}
class _NSArrayIterator implements Iterator<ObjCObjectBase> {
final Iterable<ObjCObjectBase> _iterable;
final int _length;
int _index;
ObjCObjectBase? _current;
_NSArrayIterator(Iterable<ObjCObjectBase> iterable)
: _iterable = iterable,
_length = iterable.length,
_index = 0;
@override
ObjCObjectBase get current => _current!;
@override
@pragma('vm:prefer-inline')
bool moveNext() {
final length = _iterable.length;
if (_length != length) {
throw ConcurrentModificationError(_iterable);
}
if (_index >= length) {
_current = null;
return false;
}
_current = _iterable.elementAt(_index);
_index++;
return true;
}
}