checkpoint
[sbp.git] / src / edu / berkeley / sbp / chr / CharTopology.java
diff --git a/src/edu/berkeley/sbp/chr/CharTopology.java b/src/edu/berkeley/sbp/chr/CharTopology.java
new file mode 100644 (file)
index 0000000..3a065d1
--- /dev/null
@@ -0,0 +1,39 @@
+package edu.berkeley.sbp.chr;
+import edu.berkeley.sbp.*;
+import edu.berkeley.sbp.misc.*;
+import edu.berkeley.sbp.util.*;
+
+public class CharTopology extends IntegerTopology<Character> implements Functor<Character,Integer> {
+
+    public CharTopology()               { super(null); }
+    public CharTopology(Range.Set r)    { super(null, r); }
+    public CharTopology(char a, char b) { super(null, a, b); }
+
+    public Integer invoke(Character c) { return (int)c.charValue(); }
+
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        sb.append('[');
+        Range.Set ranges = getRanges();
+        if (ranges.size() == -1 || ranges.size() > Character.MAX_VALUE/2) {
+            sb.append('~');
+            ranges = ranges.complement();
+        }
+        ranges = ranges.intersect(new Range.Set(new Range(0, Character.MAX_VALUE)));
+        for(Range r : ranges) {
+            if (r.isMinNegInf() || r.isMaxPosInf()) throw new Error("should not happen");
+            if (r.getMin()==r.getMax()) {
+                sb.append(esc((char)r.getMin()));
+            } else{
+                sb.append(esc((char)r.getMin()));
+                sb.append('-');
+                sb.append(esc((char)r.getMax()));
+            }
+        }
+        sb.append(']');
+        return sb.toString();
+    }
+
+    private String esc(char c) { return StringUtil.escapify(c+"", "[]-~\\\"\'"); }
+
+}