/******************************************************************************* * Copyright (c) 2009, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.core; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; /** * Interns Strings in a safe manner, checking for nulls first. * Does not guard against interning a String that has already been interned. * * @author crecoskie * */ public class SafeStringInterner { /** * Interns the given String, safely checking for null first. * * @param string * @return String */ public static String safeIntern(String string) { if(string != null) { return string.intern(); } return string; } /** * Interns the Strings in the given array, safely checking for null first. * * @param strArray * @return String[] */ public static String[] safeIntern(String[] strArray) { if(strArray == null) return null; for(int i =0; i < strArray.length; i++) { strArray[i] = safeIntern(strArray[i]); } return strArray; } /** * Returns a new version of the map such that all string keys and values are interned. * @return The map, after modification. */ @SuppressWarnings("unchecked") public static <T> HashMap<String, T> safeIntern(HashMap<String, T> map) { if(map == null || map.isEmpty()) { return map; } HashMap<String, T> tempMap = new HashMap<String, T>(map); map.clear(); for(String string : tempMap.keySet()) { T value = tempMap.get(string); if(value instanceof String) { value = (T) safeIntern((String) value); } map.put(safeIntern(string), value); } return map; } /** * Returns a new version of the map such that all string keys and values are interned. * * @param <T> * @param map * @return The map, after modification. */ @SuppressWarnings("unchecked") public static <T> LinkedHashMap<String, T> safeIntern(LinkedHashMap<String, T> map) { if(map == null || map.isEmpty()) { return map; } LinkedHashMap<String, T> tempMap = new LinkedHashMap<String, T>(map); map.clear(); for(String string : tempMap.keySet()) { T value = tempMap.get(string); if(value instanceof String) { value = (T) safeIntern((String) value); } map.put(safeIntern(string), value); } return map; } /** * Returns a new version of the map such that all string keys and values are interned. * * @param <T> * @param map * @return The map, after modification. */ @SuppressWarnings("unchecked") public static <T> Map<String, T> safeIntern(Map<String, T> map) { if(map == null || map.isEmpty()) { return map; } HashMap<String, T> tempMap = new HashMap<String, T>(map); map.clear(); for(String string : tempMap.keySet()) { T value = tempMap.get(string); if(value instanceof String) { value = (T) safeIntern((String) value); } map.put(safeIntern(string), value); } return map; } }