Mercurial > hg > jslab
view 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 source
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; } }