// 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 on JMap { /// 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 asDart() => _JMapAdapter(this); } final class _JMapAdapter with MapBase { final JMap _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 get keys => _JMapKeySetAdapter(_jmap.keySet()!); @override Iterable get values => _JMapValueCollectionsAdapter(_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 instead of JSet. final class _JMapKeySetAdapter with Iterable { final JSet _keys; _JMapKeySetAdapter(this._keys); @override int get length => _keys.size(); @override Iterator get iterator => JIteratorAdapter(_keys.iterator()!); @override bool contains(Object? key) => key is K ? _keys.contains(key) : false; } final class _JMapValueCollectionsAdapter with Iterable { final JCollection _values; _JMapValueCollectionsAdapter(this._values); @override Iterator get iterator => JIteratorAdapter(_values.iterator()!); } extension ToJavaMap on Map { JMap toJMap() { // TODO(https://github.com/dart-lang/native/issues/2012): Remove this as // hack. final map = (JHashMap() as JObject) as JMap; map.asDart().addAll(this); return map; } }