/*
* xtc - The eXTensible Compiler
* Copyright (C) 2005-2006 Robert Grimm
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
package xtc.parser;
import java.util.HashMap;
import java.util.Map;
/**
* A mapping between module names. This class has been designed for
* the efficient renaming of both {@link ModuleDependency module
* dependencies} and {@link NonTerminal nonterminals}.
*
* @author Robert Grimm
* @version $Revision: 1.6 $
*/
public class ModuleMap implements Renamer.Translation {
/**
* The mapping from module names (represented as strings) to module
* names (represented as {@link ModuleName module names}).
*/
protected Map<String, ModuleName> map;
/** Create a new module map. */
public ModuleMap() {
map = new HashMap<String, ModuleName>();
}
/**
* Create a new module map.
*
* @param key The single initial key.
* @param value The single initial value.
*/
public ModuleMap(ModuleName key, ModuleName value) {
map = new HashMap<String, ModuleName>();
map.put(key.name, value);
}
/**
* Create a new module map.
*
* @param keys The list of keys.
* @param values The list of values.
* @throws IllegalArgumentException
* Signals that the lists have different lengths.
*/
public ModuleMap(ModuleList keys, ModuleList values) {
if (keys.size() != values.size()) {
throw new IllegalArgumentException("Different numbers of keys and values");
}
map = new HashMap<String, ModuleName>();
int size = keys.size();
for (int i=0; i<size; i++) {
map.put(keys.get(i).name, values.get(i));
}
}
/**
* Add the specified mapping.
*
* @param key The key.
* @param value The value.
*/
public void put(ModuleName key, ModuleName value) {
map.put(key.name, value);
}
/**
* Determine whether this module map contains a mapping for the
* specified module name.
*
* @param key The module name.
* @return <code>true</code> if this module map has a value for the
* key.
*/
public boolean containsKey(ModuleName key) {
return map.containsKey(key.name);
}
/**
* Determine whether this module map contains a mapping for the
* specified module name.
*
* @param key The module name.
* @return <code>true</code> if this module map has a value for the
* key.
*/
public boolean containsKey(String key) {
return map.containsKey(key);
}
/**
* Look up the specified module name.
*
* @param key The module name.
* @return The corresponding value or <code>null</code> if there is
* no mapping for the module name.
*/
public ModuleName get(ModuleName key) {
return map.get(key.name);
}
/**
* Look up the specified module name.
*
* @param key The module name.
* @return The corresponding value or <code>null</code> if there is
* no mapping for the module name.
*/
public String get(String key) {
ModuleName value = map.get(key);
return (null == value)? null : value.name;
}
public NonTerminal map(NonTerminal nt, Analyzer analyzer) {
return nt.rename(this);
}
}