Mercurial > hg > jslab
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 |