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 |