package org.jetbrains.ether.dependencyView;
import org.jetbrains.ether.RW;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* Created by IntelliJ IDEA.
* User: db
* Date: 14.02.11
* Time: 2:03
* To change this template use File | Settings | File Templates.
*/
public class StringCache {
public static class S implements Comparable<S>, RW.Writable {
public final int index;
public final String value;
private S(final int i, final String v) {
index = i;
value = v;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
S s = (S) o;
if (index != s.index) return false;
return true;
}
@Override
public int hashCode() {
return index;
}
public int compareTo(S o) {
return index - o.index;
}
public void write(BufferedWriter w) {
RW.writeln(w, value);
}
public static final RW.Reader<S> reader = new RW.Reader<S>() {
public S read(final BufferedReader r) {
final String s = RW.readString(r);
return StringCache.get(s);
}
};
public String toString () {
return value;
}
}
private static final Map<String, S> map = new HashMap<String, S>();
private static int index = 0;
public static S get(final String s) {
// if (s == null)
// return null;
//
S r = map.get(s);
if (r == null) {
r = new S(index++, s);
map.put(s, r);
}
return r;
}
public static S[] get(final String[] s) {
if (s == null) {
return null;
}
final S[] r = new S[s.length];
for (int i = 0; i < r.length; i++)
r[i] = get(s[i]);
return r;
}
public static RW.ToWritable<S> fromS = new RW.ToWritable<S>() {
public RW.Writable convert(S x) {
return RW.fromString.convert(x.value);
}
};
public static RW.Reader<S> reader = new RW.Reader<S>() {
public S read(final BufferedReader r) {
try {
return get(r.readLine());
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
};
}