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