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;
	}
}