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