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 ) {