blob: fd17c9df50245b636413127a9aefb5a37a0fe1e9 [file] [log] [blame]
// 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 JMapToAdapter<K extends JObject?, V extends JObject?> on JMap<K, V> {
/// Wraps this [JMap] in an adapter that implements an immutable [Map].
///
/// This is not a conversion, doesn't create a new map, or change the
/// elements.
Map<K, V> asDart() => _JMapAdapter<K, V>(this);
}
final class _JMapAdapter<K extends JObject?, V extends JObject?>
with MapBase<K, V> {
final JMap<K, V> _jmap;
_JMapAdapter(this._jmap);
@override
int get length => _jmap.size();
@override
V? operator [](Object? key) => key is K ? _jmap.get(key) : null;
@override
void operator []=(K key, V value) => _jmap.put(key, value);
@override
Iterable<K> get keys => _JMapKeySetAdapter<K>(_jmap.keySet()!);
@override
Iterable<V> get values => _JMapValueCollectionsAdapter<V>(_jmap.values()!);
@override
bool containsKey(Object? key) => key is K ? _jmap.containsKey(key) : false;
@override
bool containsValue(Object? key) =>
key is K ? _jmap.containsValue(key) : false;
@override
void clear() => _jmap.clear();
@override
V? remove(Object? key) => key is K ? _jmap.remove(key) : null;
}
// Note: We could just use _JSetAdapter, except that Java's Map.keySet method
// returns JSet<K?> instead of JSet<K>.
final class _JMapKeySetAdapter<K extends JObject?> with Iterable<K> {
final JSet<K?> _keys;
_JMapKeySetAdapter(this._keys);
@override
int get length => _keys.size();
@override
Iterator<K> get iterator => JIteratorAdapter<K>(_keys.iterator()!);
@override
bool contains(Object? key) => key is K ? _keys.contains(key) : false;
}
final class _JMapValueCollectionsAdapter<V extends JObject?> with Iterable<V> {
final JCollection<V?> _values;
_JMapValueCollectionsAdapter(this._values);
@override
Iterator<V> get iterator => JIteratorAdapter<V>(_values.iterator()!);
}
extension ToJavaMap<K extends JObject?, V extends JObject?> on Map<K, V> {
JMap<K, V> toJMap() {
// TODO(https://github.com/dart-lang/native/issues/2012): Remove this as
// hack.
final map = (JHashMap() as JObject) as JMap<K, V>;
map.asDart().addAll(this);
return map;
}
}