blob: 2de1ebdc853418bb54186ef4e3f3e4308c570c64 [file] [log] [blame] [edit]
// Copyright (c) 2024, 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.
// Extra methods inserted into NSString by tool/generate_code.dart.
class NSString {
factory NSString(String str) {
final cstr = str.toNativeUtf16();
final nsstr = stringWithCharacters_length_(cstr.cast(), str.length);
pkg_ffi.calloc.free(cstr);
return nsstr;
}
}
// Extra methods inserted into NSArray by tool/generate_code.dart.
class NSArray with Iterable<objc.ObjCObjectBase> {
/// Creates a [NSArray] of the given length with [fill] at each position.
///
/// The [length] must be a non-negative integer.
static NSArray filled(int length, objc.ObjCObjectBase fill) =>
NSMutableArray.filled(length, fill);
/// Creates a [NSArray] from [elements].
static NSArray of(Iterable<objc.ObjCObjectBase> elements) =>
NSMutableArray.of(elements);
@override
int get length => count;
@override
objc.ObjCObjectBase elementAt(int index) => objectAtIndex_(index);
@override
Iterator<objc.ObjCObjectBase> get iterator => _NSArrayIterator(this);
objc.ObjCObjectBase operator [](int index) => objectAtIndex_(index);
}
// Extra methods inserted into NSMutableArray by tool/generate_code.dart.
class NSMutableArray with ListMixin<objc.ObjCObjectBase> {
/// Creates a [NSMutableArray] of the given length with [fill] at each
/// position.
///
/// The [length] must be a non-negative integer.
static NSMutableArray filled(int length, objc.ObjCObjectBase fill) {
final a = arrayWithCapacity_(length);
for (var i = 0; i < length; ++i) a.add(fill);
return a;
}
/// Creates a [NSMutableArray] from [elements].
static NSMutableArray of(Iterable<objc.ObjCObjectBase> elements) =>
arrayWithCapacity_(elements.length)..addAll(elements);
@override
set length(int newLength) {
var len = length;
RangeError.checkValueInInterval(newLength, 0, len);
for (; len > newLength; --len) removeLastObject();
}
@override
void operator []=(int index, objc.ObjCObjectBase value) =>
replaceObjectAtIndex_withObject_(index, value);
@override
void add(objc.ObjCObjectBase value) => addObject_(value);
@override
void addAll(Iterable<objc.ObjCObjectBase> iterable) {
for (final value in iterable) add(value);
}
}
class _NSArrayIterator implements Iterator<objc.ObjCObjectBase> {
final Iterable<objc.ObjCObjectBase> _iterable;
final int _length;
int _index;
objc.ObjCObjectBase? _current;
_NSArrayIterator(Iterable<objc.ObjCObjectBase> iterable)
: _iterable = iterable,
_length = iterable.length,
_index = 0;
@override
objc.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;
}
}