| // 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:collection/collection.dart'; | |
| import 'converter.dart'; | |
| import 'internal.dart'; | |
| import 'ns_enumerator.dart'; | |
| import 'objective_c_bindings_generated.dart'; | |
| class _NSSetAdapter with SetBase<ObjCObject>, UnmodifiableSetMixin<ObjCObject> { | |
| final NSSet _set; | |
| _NSSetAdapter(this._set); | |
| @override | |
| int get length => _set.count; | |
| @override | |
| bool contains(Object? element) => | |
| element is ObjCObject ? _set.containsObject(element) : false; | |
| @override | |
| ObjCObject? lookup(Object? element) => | |
| element is ObjCObject ? _set.member(element) : null; | |
| @override | |
| Iterator<ObjCObject> get iterator => _set.objectEnumerator().asDart(); | |
| @override | |
| Set<ObjCObject> toSet() => {...this}; | |
| } | |
| extension NSSetToAdapter on NSSet { | |
| /// Wraps this [NSSet] in an adapter that implements an immutable [Set]. | |
| /// | |
| /// This is not a conversion, doesn't create a new set, or change the | |
| /// elements. For deep conversion, use [toDartSet]. | |
| Set<ObjCObject> asDart() => _NSSetAdapter(this); | |
| } | |
| class _NSMutableSetAdapter with SetBase<ObjCObject> { | |
| final NSMutableSet _set; | |
| _NSMutableSetAdapter(this._set); | |
| @override | |
| int get length => _set.count; | |
| @override | |
| bool contains(Object? element) => | |
| element is ObjCObject ? _set.containsObject(element) : false; | |
| @override | |
| ObjCObject? lookup(Object? element) => | |
| element is ObjCObject ? _set.member(element) : null; | |
| @override | |
| Iterator<ObjCObject> get iterator => _set.objectEnumerator().asDart(); | |
| @override | |
| Set<ObjCObject> toSet() => {...this}; | |
| @override | |
| bool add(ObjCObject value) { | |
| final alreadyContains = contains(value); | |
| _set.addObject(value); | |
| return !alreadyContains; | |
| } | |
| @override | |
| bool remove(Object? value) { | |
| if (value is! ObjCObject) return false; | |
| final alreadyContains = contains(value); | |
| _set.removeObject(value); | |
| return alreadyContains; | |
| } | |
| @override | |
| void clear() => _set.removeAllObjects(); | |
| } | |
| extension NSMutableSetToAdapter on NSMutableSet { | |
| /// Wraps this [NSMutableSet] in an adapter that implements [Set]. | |
| /// | |
| /// This is not a conversion, doesn't create a new set, or change the | |
| /// elements. For deep conversion, use [toDartSet]. | |
| Set<ObjCObject> asDart() => _NSMutableSetAdapter(this); | |
| } |