blob: 1b9b22c50b6b2799d5a166a1989164f4c633b0bf [file] [edit]
// Copyright (c) 2023, 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 '../core_bindings.dart';
import '../jobject.dart';
import 'jiterator.dart';
extension JSetToAdapter<E extends JObject?> on JSet<E> {
/// Wraps this [JSet] in an adapter that implements a [Set].
///
/// This is not a conversion, doesn't create a new list, or change the
/// elements.
Set<E> asDart() => _JSetAdapter<E>(this);
}
final class _JSetAdapter<E extends JObject?> with SetBase<E> {
final JSet<E> _jset;
_JSetAdapter(this._jset);
@override
int get length => _jset.size();
@override
bool contains(Object? element) =>
element is JObject? ? _jset.contains(element) : false;
@override
E? lookup(Object? element) => throw UnsupportedError(
"Java's Set class has no equivalent of Dart's Set.lookup method.");
@override
Iterator<E> get iterator => JIteratorAdapter<E>(_jset.iterator()!);
@override
Set<E> toSet() => {...this};
@override
bool add(E value) => _jset.add(value);
@override
bool remove(Object? value) => value is JObject? ? _jset.remove(value) : false;
@override
void clear() => _jset.clear();
}
extension ToJavaSet<E extends JObject?> on Iterable<E> {
JSet<E> toJSet() {
// TODO(https://github.com/dart-lang/native/issues/2012): Remove this as
// hack.
final set = (JHashSet() as JObject) as JSet<E>;
set.asDart().addAll(this);
return set;
}
}