Mercurial Hosting > luan
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); |