comparison core/src/luan/LuanTableImpl.java @ 355:1bce334a816b

AbstractLuanTable now implements LuanRepr
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 14 Apr 2015 09:33:34 -0600
parents 9fb523472035
children 1a464e090538
comparison
equal deleted inserted replaced
354:705e4d6c3dbb 355:1bce334a816b
12 import java.util.HashSet; 12 import java.util.HashSet;
13 import java.util.IdentityHashMap; 13 import java.util.IdentityHashMap;
14 import java.util.regex.Pattern; 14 import java.util.regex.Pattern;
15 15
16 16
17 class LuanTableImpl extends AbstractLuanTable implements LuanTable, DeepCloneable<LuanTableImpl>, LuanRepr { 17 class LuanTableImpl extends AbstractLuanTable implements LuanTable, DeepCloneable<LuanTableImpl> {
18 private Map<Object,Object> map = null; 18 private Map<Object,Object> map = null;
19 private List<Object> list = null; 19 private List<Object> list = null;
20 private LuanTable metatable = null; 20 private LuanTable metatable = null;
21 private boolean hasJava = false; 21 private boolean hasJava = false;
22 22
88 return list!=null ? list : Collections.emptyList(); 88 return list!=null ? list : Collections.emptyList();
89 } 89 }
90 90
91 @Override public Map<Object,Object> asMap() { 91 @Override public Map<Object,Object> asMap() {
92 if( list == null || list.isEmpty() ) 92 if( list == null || list.isEmpty() )
93 return map!=null ? map : Collections.emptyMap(); 93 return map();
94 Map<Object,Object> rtn = map!=null ? newMap(map) : newMap(); 94 Map<Object,Object> rtn = map!=null ? newMap(map) : newMap();
95 for( ListIterator iter = list.listIterator(); iter.hasNext(); ) { 95 for( ListIterator iter = list.listIterator(); iter.hasNext(); ) {
96 int i = iter.nextIndex(); 96 int i = iter.nextIndex();
97 rtn.put(i+1,iter.next()); 97 rtn.put(i+1,iter.next());
98 } 98 }
99 return rtn; 99 return rtn;
100 }
101
102 @Override protected Map<Object,Object> map() {
103 return map!=null ? map : Collections.emptyMap();
100 } 104 }
101 105
102 public boolean isSet() { 106 public boolean isSet() {
103 if( list != null ) { 107 if( list != null ) {
104 for( Object obj : list ) { 108 for( Object obj : list ) {
125 return rtn; 129 return rtn;
126 } 130 }
127 131
128 @Override protected String type() { 132 @Override protected String type() {
129 return "table"; 133 return "table";
130 }
131
132 @Override public String repr() {
133 return repr( Collections.newSetFromMap(new IdentityHashMap<LuanTableImpl,Boolean>()) );
134 }
135
136 private String repr(Set<LuanTableImpl> set) {
137 if( !set.add(this) ) {
138 return "\"<circular reference>\"";
139 }
140 StringBuilder sb = new StringBuilder();
141 sb.append('{');
142 boolean isFirst = true;
143 if( list != null ) {
144 for( int i=0; i<list.size(); i++ ) {
145 Object obj = list.get(i);
146 if( isFirst ) {
147 isFirst = false;
148 } else {
149 sb.append(", ");
150 }
151 sb.append(repr(set,obj));
152 }
153 }
154 if( map != null ) {
155 for( Map.Entry<Object,Object> entry : map.entrySet() ) {
156 if( isFirst ) {
157 isFirst = false;
158 } else {
159 sb.append(", ");
160 }
161 sb.append(reprKey(set,entry.getKey())).append('=').append(repr(set,entry.getValue()));
162 }
163 }
164 sb.append('}');
165 return sb.toString();
166 }
167
168 private static final Pattern namePtn = Pattern.compile("[a-zA-Z_][a-zA-Z_0-9]*");
169
170 private String reprKey(Set<LuanTableImpl> set,Object obj) {
171 if( obj instanceof String ) {
172 String s = (String)obj;
173 if( namePtn.matcher(s).matches() )
174 return s;
175 }
176 return "[" + repr(set,obj) + "]";
177 }
178
179 String repr(Set<LuanTableImpl> set,Object obj) {
180 if( obj instanceof LuanTableImpl ) {
181 LuanTableImpl t = (LuanTableImpl)obj;
182 return t.repr(set);
183 } else {
184 String s = Luan.repr(obj);
185 if( s == null )
186 s = "<couldn't repr: " + Luan.stringEncode(Luan.toString(obj)) + ">";
187 return s;
188 }
189 } 134 }
190 135
191 @Override public Object get(Object key) { 136 @Override public Object get(Object key) {
192 if( list != null ) { 137 if( list != null ) {
193 Integer iT = Luan.asInteger(key); 138 Integer iT = Luan.asInteger(key);