checkpoint
authoradam <adam@megacz.com>
Sun, 15 Jan 2006 09:15:30 +0000 (04:15 -0500)
committeradam <adam@megacz.com>
Sun, 15 Jan 2006 09:15:30 +0000 (04:15 -0500)
darcs-hash:20060115091530-5007d-035f0ed02d39916e0194ceab570fff29cab28f93.gz

src/edu/berkeley/sbp/misc/CharRange.java
src/edu/berkeley/sbp/misc/CharToStringParser.java
src/edu/berkeley/sbp/misc/CharToken.java
src/edu/berkeley/sbp/util/IntegerTopology.java

index 932fbd6..59ee325 100644 (file)
@@ -20,7 +20,7 @@ public class CharRange extends Atom<CharToken> {
             sb.append('~');
             ranges = ranges.complement();
         }
-        ranges = ranges.intersect(CharToken.all);
+        ranges = ranges.intersect(all);
         for(Range r : ranges) {
             if (r.isMinNegInf() || r.isMaxPosInf()) throw new Error("should not happen");
             if (r.getMin()==r.getMax()) {
@@ -36,7 +36,8 @@ public class CharRange extends Atom<CharToken> {
     }
     public static final Atom leftBrace  = CharToken.leftBrace;
     public static final Atom rightBrace = CharToken.rightBrace;
-    public static Atom set(Range.Set r) { return new CharRange(new IntegerTopology<CharToken>(r)); }
+    public static Atom set(Range.Set r) { return new CharRange(new IntegerTopology<CharToken>(null, r)); }
+    private static final Range.Set all = new Range.Set(new Range(0, Character.MAX_VALUE));
 
     /** returns an element which exactly matches the string given */
     public static Element string(String s) {
@@ -45,13 +46,13 @@ public class CharRange extends Atom<CharToken> {
         Element ret;
         if (s.length() == 1) {
             ret =
-                new CharRange(new IntegerTopology<CharToken>((int)s.charAt(0))) {
+                new CharRange(new IntegerTopology<CharToken>(null, (int)s.charAt(0))) {
                     public String toString() { return escapified; } };
         } else {
             Union ret2 = new Union("\""+s+"\"_str", true) {
                     public String toString() { return escapified; } };
             Element[] refs = new Element[s.length()];
-            for(int i=0; i<refs.length; i++) refs[i] = new CharRange(new IntegerTopology<CharToken>((int)s.charAt(i)));
+            for(int i=0; i<refs.length; i++) refs[i] = new CharRange(new IntegerTopology<CharToken>(null, (int)s.charAt(i)));
             ret2.add(Sequence.constant(refs, s, null, null));
             ret = ret2;
         }
index 802d689..c66ff5d 100644 (file)
@@ -8,14 +8,36 @@ import edu.berkeley.sbp.Token.Location;
 import edu.berkeley.sbp.util.*;
 
 public class CharToStringParser extends Parser<CharToken,String> {
-    public CharToStringParser(Union u) { super(u, new IntegerTopology<CharToken>()); }
     public Forest<String> parse(InputStream is) throws IOException, ParseFailed {
-        return super.parse(new CharToken.Stream(is));
+        return super.parse(new Stream(is));
     }
     public Forest<String> parse(Reader r) throws IOException, ParseFailed {
-        return super.parse(new CharToken.Stream(r));
+        return super.parse(new Stream(r));
     }
+
+    public CharToStringParser(Union u) { super(u, new IntegerTopology<CharToken>(null)); }
     public Forest<String> shiftToken(CharToken ct, Location loc) {
         return Forest.create(loc, ct.result(), null, false, false);
     }
+
+    private static class Stream extends CartesianInput<CharToken> {
+        private final Reader r;
+        
+        public Stream(String s)                { this(new StringReader(s)); }
+        public Stream(Reader r)                { this(r, null); }
+        public Stream(Reader r,      String s) { this.r = r; }
+        public Stream(InputStream i)           { this(i, null); }
+        public Stream(InputStream i, String s) { this(new InputStreamReader(i), s); }
+
+        boolean cr = false;
+        public boolean   isCR() { return cr; }
+        public CharToken next() throws IOException {
+            cr = false;
+            int i = r.read();
+            if (i==-1) return null;
+            char c = (char)i;
+            cr = c=='\n';
+            return new CharToken(c);
+        }
+    }
 }
index 49d4dea..eafe882 100644 (file)
@@ -10,15 +10,11 @@ import edu.berkeley.sbp.util.*;
 /** an implementation of Token for streams of Java <tt>char</tt> values */
 public class CharToken implements IntegerMappable {
 
-    public static final Atom leftBrace  = new CharRange(new IntegerTopology<CharToken>(9998)) { public String toString() { return "{"; } };
-    public static final Atom rightBrace = new CharRange(new IntegerTopology<CharToken>(9999)) { public String toString() { return "}"; } };
+    public static final Atom leftBrace  = new CharRange(new IntegerTopology<CharToken>(null, 9998)) { public String toString() { return "{"; } };
+    public static final Atom rightBrace = new CharRange(new IntegerTopology<CharToken>(null, 9999)) { public String toString() { return "}"; } };
     public static final CharToken left       = new CharToken((char)9998);
     public static final CharToken right      = new CharToken((char)9999);
     
-    static final Range.Set all = new Range.Set(new Range(0, Character.MAX_VALUE));
-    public  static final Atom      any = new CharRange(new IntegerTopology<CharToken>(all));
-    public  static final Atom     none = new CharRange(new IntegerTopology<CharToken>());
-
     // Private //////////////////////////////////////////////////////////////////////////////
 
     public final char c;
@@ -30,24 +26,4 @@ public class CharToken implements IntegerMappable {
 
     public int toInt() { return (int)c; }
 
-    public static class Stream extends CartesianInput<CharToken> {
-        private final Reader r;
-        
-        public Stream(String s)                { this(new StringReader(s)); }
-        public Stream(Reader r)                { this(r, null); }
-        public Stream(Reader r,      String s) { this.r = r; }
-        public Stream(InputStream i)           { this(i, null); }
-        public Stream(InputStream i, String s) { this(new InputStreamReader(i), s); }
-
-        boolean cr = false;
-        public boolean   isCR() { return cr; }
-        public CharToken next() throws IOException {
-            cr = false;
-            int i = r.read();
-            if (i==-1) return null;
-            char c = (char)i;
-            cr = c=='\n';
-            return new CharToken(c);
-        }
-    }
 }
index e82ce73..ae99c08 100644 (file)
@@ -3,33 +3,36 @@ import java.io.*;
 import java.util.*;
 import java.lang.reflect.*;
 import java.lang.ref.*;
-import edu.berkeley.sbp.util.*;
 import edu.berkeley.sbp.*;
+import edu.berkeley.sbp.util.*;
 
 /** implementation of <tt>Topology</tt> for any class for which there is a mapping to the <tt>int</tt>s */
-public class IntegerTopology<V extends IntegerMappable> implements Topology<V> {
+public class IntegerTopology<V> implements Topology<V> {
+
     private final Range.Set rs;
+    private final Functor<V,Integer> f;
 
-    private static final IntegerTopology empty = new IntegerTopology();
+    private int toInt(V v) { return f==null?((IntegerMappable)v).toInt():f.invoke(v); }
 
     public Range.Set getRanges()         { return new Range.Set(rs); }
 
-    public IntegerTopology()             { this(new Range.Set()); }
-    public IntegerTopology(V v)          { this(v.toInt()); }
-    public IntegerTopology(V a, V b)     { this(a.toInt(), b.toInt()); }
-    public IntegerTopology(int a)        { this(a, a); }
-    public IntegerTopology(int a, int b) { this(new Range(a, b)); }
-    public IntegerTopology(Range r)      { this(new Range.Set(r)); }
-    public IntegerTopology(Range.Set rs) { this.rs = rs; }
+    public IntegerTopology(Functor<V,Integer> f)               { this(f, new Range.Set()); }
+    public IntegerTopology(Functor<V,Integer> f, V a)          { this(f, f==null?((IntegerMappable)a).toInt():f.invoke(a)); }
+    public IntegerTopology(Functor<V,Integer> f, V a, V b)     { this(f, f==null?((IntegerMappable)a).toInt():f.invoke(a),
+                                                                      f==null?((IntegerMappable)b).toInt():f.invoke(b)); }
+    public IntegerTopology(Functor<V,Integer> f, int a)        { this(f, a, a); }
+    public IntegerTopology(Functor<V,Integer> f, int a, int b) { this(f, new Range(a, b)); }
+    public IntegerTopology(Functor<V,Integer> f, Range r)      { this(f, new Range.Set(r)); }
+    public IntegerTopology(Functor<V,Integer> f, Range.Set rs) { this.rs = rs; this.f = f; }
 
-    public Topology<V> empty()             { return (Topology<V>)empty;   }
+    public Topology<V> empty()              { return new IntegerTopology<V>(f);   }
         
-    public boolean          contains(V v)              { return rs.contains(v.toInt()); }
+    public boolean          contains(V v)              { return rs.contains(toInt(v)); }
         
-    public Topology<V>      complement()               { return new IntegerTopology<V>(rs.complement()); }
-    public Topology<V>      intersect(Topology<V> t)   { return new IntegerTopology<V>(rs.intersect(((IntegerTopology<V>)t.unwrap()).rs)); }
-    public Topology<V>      minus(Topology<V> t)       { return new IntegerTopology<V>(rs.intersect(((IntegerTopology<V>)t.unwrap()).rs.complement())); }
-    public Topology<V>      union(Topology<V> t)       { return new IntegerTopology<V>(rs.union(((IntegerTopology<V>)t.unwrap()).rs)); }
+    public Topology<V>      complement()               { return new IntegerTopology<V>(f, rs.complement()); }
+    public Topology<V>      intersect(Topology<V> t)   { return new IntegerTopology<V>(f, rs.intersect(((IntegerTopology<V>)t.unwrap()).rs)); }
+    public Topology<V>      minus(Topology<V> t)       { return new IntegerTopology<V>(f, rs.intersect(((IntegerTopology<V>)t.unwrap()).rs.complement())); }
+    public Topology<V>      union(Topology<V> t)       { return new IntegerTopology<V>(f, rs.union(((IntegerTopology<V>)t.unwrap()).rs)); }
     public boolean          disjoint(Topology<V> t)    { return rs.intersect(((IntegerTopology<V>)t.unwrap()).rs).size()==0; }
     public boolean          containsAll(Topology<V> t) { return rs.containsAll(((IntegerTopology<V>)t.unwrap()).rs); }
 
@@ -37,34 +40,4 @@ public class IntegerTopology<V extends IntegerMappable> implements Topology<V> {
     public int     hashCode()                          { return rs.hashCode(); }
     public boolean equals(Object o)                    { return o!=null && o instanceof IntegerTopology && ((IntegerTopology<V>)o).rs.equals(rs); }
 
-    // FIXME: this is currently char-range specific
-    /*
-    public String toString() {
-        String classname = this.getClass().getName().replace('$', '.');
-        if (rs==null) return "new " + classname + "()";
-        StringBuffer sb = new StringBuffer();
-        sb.append("new ");
-        sb.append(classname);
-        sb.append("(new Range.Set(new Range[] { ");
-        for(Range r : rs) {
-            sb.append("new Range(");
-            if (r.isMinNegInf() && r.isMaxPosInf()) {
-                sb.append("true, true");
-            } else if (r.isMinNegInf()) {
-                sb.append("true, ");
-                sb.append(r.getMax());
-            } else if (r.isMaxPosInf()) {
-                sb.append(r.getMin());
-                sb.append(", true");
-            } else {
-                sb.append(r.getMin());
-                sb.append(", ");
-                sb.append(r.getMax());
-            }
-            sb.append(")");
-        }
-        sb.append("new Range() }))");
-        return sb.toString();
-    }
-    */
 }