Mercurial > hg > jslab
diff src/samer/core_/util/HashMap.java @ 0:bf79fb79ee13
Initial Mercurial check in.
author | samer |
---|---|
date | Tue, 17 Jan 2012 17:50:20 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/samer/core_/util/HashMap.java Tue Jan 17 17:50:20 2012 +0000 @@ -0,0 +1,94 @@ +package samer.core.util; +import samer.core.*; + + +public class HashMap extends Environment +{ + java.util.HashMap map=new java.util.HashMap(); + + public HashMap(Environment parent) { super(parent,parent.node()); } + public HashMap(Environment parent, String name) { + super(parent,new Node(name,parent.node())); + } + + protected class Entry implements Binding + { + String nm; + Object vl; + int sc; + + Entry(String n, Object v, int s) { nm=n; vl=v; sc=s; } + + public String name() { return abs(nm); } + public int score() { return sc; } + + public Object get() { return vl; } + public Object get(Codec c, Object def) { return c.decode(vl); } + public void get(Autocoder obj) { obj.decode(vl); } + + public void set(Object obj) { map.put(nm,obj); } + public void remove() { map.remove(nm); } + } + + public Binding add(String name, Object value) + { + // check for existing value?? + if (belongs(name)) { + String key=rel(name); + map.put(key,value); + return new Entry(key,value,0); + } else return super.add(name,value); + } + + public Datum datum(String name) + { + Binding local=localFind(rel(name)); // localised name + if (local.score()>0) { + // if match is less than perfect, get parent's best match + Datum inherited=parent.datum(abs(name)); + if (inherited.score()<local.score()) return inherited; + } + return local; + } + + public Binding binding(String name) + { + Binding local=localFind(rel(name)); // localised name + + if (local.score()>0) { + // if match is less than perfect, get parent's best match + Binding inherited=parent.binding(abs(name)); + if (inherited.score()<local.score()) return inherited; + } + return local; + } + + public Iterator data() + { + return new CompoundIterator( + new Iterator() { + java.util.Iterator it=map.entrySet().iterator(); + public boolean hasNext() { return it.hasNext(); } + public Datum next() { + java.util.Map.Entry entry=(java.util.Map.Entry)it.next(); + return new Entry((String)entry.getKey(),entry.getValue(),0); + } + }, + parent.data() + ); + } + + protected Binding localFind(String key) + { + String pname = '.'+key; + + for (int i=0, s=0; i>=0; s++) { + pname = pname.substring(i+1); + Object val=map.get(pname); + if (val!=null) return new Entry(pname,val,s); + i = pname.indexOf('.'); + } + return Null; + } +} + \ No newline at end of file