annotate src/samer/core_/util/HashMap.java @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
rev   line source
samer@0 1 package samer.core.util;
samer@0 2 import samer.core.*;
samer@0 3
samer@0 4
samer@0 5 public class HashMap extends Environment
samer@0 6 {
samer@0 7 java.util.HashMap map=new java.util.HashMap();
samer@0 8
samer@0 9 public HashMap(Environment parent) { super(parent,parent.node()); }
samer@0 10 public HashMap(Environment parent, String name) {
samer@0 11 super(parent,new Node(name,parent.node()));
samer@0 12 }
samer@0 13
samer@0 14 protected class Entry implements Binding
samer@0 15 {
samer@0 16 String nm;
samer@0 17 Object vl;
samer@0 18 int sc;
samer@0 19
samer@0 20 Entry(String n, Object v, int s) { nm=n; vl=v; sc=s; }
samer@0 21
samer@0 22 public String name() { return abs(nm); }
samer@0 23 public int score() { return sc; }
samer@0 24
samer@0 25 public Object get() { return vl; }
samer@0 26 public Object get(Codec c, Object def) { return c.decode(vl); }
samer@0 27 public void get(Autocoder obj) { obj.decode(vl); }
samer@0 28
samer@0 29 public void set(Object obj) { map.put(nm,obj); }
samer@0 30 public void remove() { map.remove(nm); }
samer@0 31 }
samer@0 32
samer@0 33 public Binding add(String name, Object value)
samer@0 34 {
samer@0 35 // check for existing value??
samer@0 36 if (belongs(name)) {
samer@0 37 String key=rel(name);
samer@0 38 map.put(key,value);
samer@0 39 return new Entry(key,value,0);
samer@0 40 } else return super.add(name,value);
samer@0 41 }
samer@0 42
samer@0 43 public Datum datum(String name)
samer@0 44 {
samer@0 45 Binding local=localFind(rel(name)); // localised name
samer@0 46 if (local.score()>0) {
samer@0 47 // if match is less than perfect, get parent's best match
samer@0 48 Datum inherited=parent.datum(abs(name));
samer@0 49 if (inherited.score()<local.score()) return inherited;
samer@0 50 }
samer@0 51 return local;
samer@0 52 }
samer@0 53
samer@0 54 public Binding binding(String name)
samer@0 55 {
samer@0 56 Binding local=localFind(rel(name)); // localised name
samer@0 57
samer@0 58 if (local.score()>0) {
samer@0 59 // if match is less than perfect, get parent's best match
samer@0 60 Binding inherited=parent.binding(abs(name));
samer@0 61 if (inherited.score()<local.score()) return inherited;
samer@0 62 }
samer@0 63 return local;
samer@0 64 }
samer@0 65
samer@0 66 public Iterator data()
samer@0 67 {
samer@0 68 return new CompoundIterator(
samer@0 69 new Iterator() {
samer@0 70 java.util.Iterator it=map.entrySet().iterator();
samer@0 71 public boolean hasNext() { return it.hasNext(); }
samer@0 72 public Datum next() {
samer@0 73 java.util.Map.Entry entry=(java.util.Map.Entry)it.next();
samer@0 74 return new Entry((String)entry.getKey(),entry.getValue(),0);
samer@0 75 }
samer@0 76 },
samer@0 77 parent.data()
samer@0 78 );
samer@0 79 }
samer@0 80
samer@0 81 protected Binding localFind(String key)
samer@0 82 {
samer@0 83 String pname = '.'+key;
samer@0 84
samer@0 85 for (int i=0, s=0; i>=0; s++) {
samer@0 86 pname = pname.substring(i+1);
samer@0 87 Object val=map.get(pname);
samer@0 88 if (val!=null) return new Entry(pname,val,s);
samer@0 89 i = pname.indexOf('.');
samer@0 90 }
samer@0 91 return Null;
samer@0 92 }
samer@0 93 }
samer@0 94