001    // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
002    // for details. All rights reserved. Use of this source code is governed by a
003    // BSD-style license that can be found in the LICENSE file.
004    
005    package com.google.dart.compiler.util;
006    
007    import java.util.Collections;
008    import java.util.HashMap;
009    import java.util.Map;
010    
011    /**
012     * Utility methods for operating on memory-efficient maps. All maps of size 0 or
013     * 1 are assumed to be immutable. All maps of size greater than 1 are assumed to
014     * be mutable.
015     */
016    public class Maps {
017        private Maps() {
018        }
019    
020        public static <K, V> Map<K, V> put(Map<K, V> map, K key, V value) {
021            switch (map.size()) {
022                case 0:
023                    // Empty -> Singleton
024                    return Collections.singletonMap(key, value);
025                case 1: {
026                    if (map.containsKey(key)) {
027                        return Collections.singletonMap(key, value);
028                    }
029                    // Singleton -> HashMap
030                    Map<K, V> result = new HashMap<K, V>();
031                    result.put(map.keySet().iterator().next(), map.values().iterator().next());
032                    result.put(key, value);
033                    return result;
034                }
035                default:
036                    // HashMap
037                    map.put(key, value);
038                    return map;
039            }
040        }
041    }