The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package org.maltparser.core.feature.spec;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

/**
*
*
* @author Johan Hall
*/
public class SpecificationSubModel implements Iterable<String> {
	private Map<String, Integer> featureSpec2IndexMap;
	private int counter;
	private String name;
	
	public SpecificationSubModel() {
		this("MAIN");
	}
	
	public SpecificationSubModel(String name) {
		setSubModelName(name);
		featureSpec2IndexMap = new LinkedHashMap<String, Integer>();
		counter = 0;
	}
	
	public void add(String featureSpec) {
		if (!featureSpec2IndexMap.containsKey(featureSpec)) {
			featureSpec2IndexMap.put(featureSpec, counter++);
		}
	}
	
	public int getFeatureIndex(String featureSpec) {
		if (featureSpec2IndexMap.containsKey(featureSpec)) {
			return -1;
		}
		return featureSpec2IndexMap.get(featureSpec);
	}
	
	public String getFeatureSpec(int featureId) {
		if (featureId < 0 || featureId >= featureSpec2IndexMap.size()) {
			return null;
		}
		return featureSpec2IndexMap.keySet().toArray(new String[]{})[featureId];
	}

	public String getSubModelName() {
		return name;
	}

	public void setSubModelName(String name) {
		this.name = name;
	}

	public int size() {
		return featureSpec2IndexMap.size();
	}
	
	public Iterator<String> iterator() {
		return featureSpec2IndexMap.keySet().iterator();
	}
	
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		if (featureSpec2IndexMap.size() != ((SpecificationSubModel)obj).size()) { return false; }
		for (String str : this) {
			if (!str.equals(((SpecificationSubModel)obj).getFeatureSpec(featureSpec2IndexMap.get(str)))) {
				return false;
			}
		}
		return true;
	}

	public String toString() {
		StringBuilder sb = new StringBuilder();
		for (String str : this) {
			sb.append(featureSpec2IndexMap.get(str));
			sb.append('\t');
			sb.append(str);
			sb.append('\n');
		}
		return sb.toString();
	}
}