Mercurial Hosting > luan
comparison src/luan/LuanTable.java @ 88:6ca02b188dba
add LuanBit to clean up code;
add repr();
git-svn-id: https://luan-java.googlecode.com/svn/trunk@89 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Wed, 27 Feb 2013 23:50:32 +0000 |
parents | 6db8f286fa6c |
children | 3c404a296995 |
comparison
equal
deleted
inserted
replaced
87:eaf37cfa30c2 | 88:6ca02b188dba |
---|---|
9 import java.util.Collections; | 9 import java.util.Collections; |
10 import java.util.Comparator; | 10 import java.util.Comparator; |
11 import java.util.Set; | 11 import java.util.Set; |
12 import java.util.HashSet; | 12 import java.util.HashSet; |
13 import java.util.IdentityHashMap; | 13 import java.util.IdentityHashMap; |
14 | 14 import java.util.regex.Pattern; |
15 | 15 |
16 public final class LuanTable implements DeepCloneable<LuanTable>, Iterable<Map.Entry<Object,Object>> { | 16 |
17 public final class LuanTable implements DeepCloneable<LuanTable>, Iterable<Map.Entry<Object,Object>>, LuanRepr { | |
17 private Map<Object,Object> map = null; | 18 private Map<Object,Object> map = null; |
18 private List<Object> list = null; | 19 private List<Object> list = null; |
19 private LuanTable metatable = null; | 20 private LuanTable metatable = null; |
20 | 21 |
21 public LuanTable() {} | 22 public LuanTable() {} |
103 | 104 |
104 @Override public String toString() { | 105 @Override public String toString() { |
105 return "table: " + Integer.toHexString(hashCode()); | 106 return "table: " + Integer.toHexString(hashCode()); |
106 } | 107 } |
107 | 108 |
108 public String show() { | 109 public String repr() { |
109 return show( Collections.newSetFromMap(new IdentityHashMap<LuanTable,Boolean>()) ); | 110 return repr( Collections.newSetFromMap(new IdentityHashMap<LuanTable,Boolean>()) ); |
110 } | 111 } |
111 | 112 |
112 private String show(Set<LuanTable> set) { | 113 private String repr(Set<LuanTable> set) { |
113 if( !set.add(this) ) { | 114 if( !set.add(this) ) { |
114 return "..."; | 115 return "\"<circular reference>\""; |
115 } | 116 } |
116 StringBuilder sb = new StringBuilder(); | 117 StringBuilder sb = new StringBuilder(); |
117 sb.append('{'); | 118 sb.append('{'); |
118 boolean isFirst = true; | 119 boolean isFirst = true; |
119 if( list != null ) { | 120 if( list != null ) { |
128 } else { | 129 } else { |
129 sb.append(", "); | 130 sb.append(", "); |
130 } | 131 } |
131 if( gotNull ) | 132 if( gotNull ) |
132 sb.append(i+1).append('='); | 133 sb.append(i+1).append('='); |
133 sb.append(show(set,obj)); | 134 sb.append(repr(set,obj)); |
134 } | 135 } |
135 } | 136 } |
136 } | 137 } |
137 if( map != null ) { | 138 if( map != null ) { |
138 for( Map.Entry<Object,Object> entry : map.entrySet() ) { | 139 for( Map.Entry<Object,Object> entry : map.entrySet() ) { |
139 if( isFirst ) { | 140 if( isFirst ) { |
140 isFirst = false; | 141 isFirst = false; |
141 } else { | 142 } else { |
142 sb.append(", "); | 143 sb.append(", "); |
143 } | 144 } |
144 sb.append(show(set,entry.getKey())).append('=').append(show(set,entry.getValue())); | 145 sb.append(reprKey(set,entry.getKey())).append('=').append(repr(set,entry.getValue())); |
145 } | 146 } |
146 } | 147 } |
147 sb.append('}'); | 148 sb.append('}'); |
148 return sb.toString(); | 149 return sb.toString(); |
149 } | 150 } |
150 | 151 |
151 private static String show(Set<LuanTable> set,Object obj) { | 152 private static final Pattern namePtn = Pattern.compile("[a-zA-Z_][a-zA-Z_0-9]*"); |
153 | |
154 private static String reprKey(Set<LuanTable> set,Object obj) { | |
155 if( obj instanceof String ) { | |
156 String s = (String)obj; | |
157 if( namePtn.matcher(s).matches() ) | |
158 return s; | |
159 } | |
160 return "[" + repr(set,obj) + "]"; | |
161 } | |
162 | |
163 private static String repr(Set<LuanTable> set,Object obj) { | |
152 if( obj instanceof LuanTable ) { | 164 if( obj instanceof LuanTable ) { |
153 LuanTable t = (LuanTable)obj; | 165 LuanTable t = (LuanTable)obj; |
154 return t.show(set); | 166 return t.repr(set); |
155 } else { | 167 } else { |
156 return Luan.toString(obj); | 168 String s = Luan.repr(obj); |
169 if( s == null ) | |
170 s = "\"<couldn't repr: " + Luan.stringEncode(Luan.toString(obj)) + ">\""; | |
171 return s; | |
157 } | 172 } |
158 } | 173 } |
159 | 174 |
160 public Object get(Object key) { | 175 public Object get(Object key) { |
161 if( list != null ) { | 176 if( list != null ) { |