comparison src/luan/LuaTable.java @ 47:659c7139e903

better conversion git-svn-id: https://luan-java.googlecode.com/svn/trunk@48 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 27 Dec 2012 04:36:44 +0000
parents a443637829c1
children
comparison
equal deleted inserted replaced
46:a443637829c1 47:659c7139e903
6 import java.util.HashMap; 6 import java.util.HashMap;
7 import java.util.List; 7 import java.util.List;
8 import java.util.ArrayList; 8 import java.util.ArrayList;
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;
12 import java.util.HashSet;
11 13
12 14
13 public class LuaTable { 15 public class LuaTable {
14 private Map<Object,Object> map = null; 16 private Map<Object,Object> map = null;
15 private List<Object> list = null; 17 private List<Object> list = null;
19 21
20 public LuaTable(List<Object> list) { 22 public LuaTable(List<Object> list) {
21 this.list = list; 23 this.list = list;
22 } 24 }
23 25
26 public LuaTable(Map<Object,Object> map) {
27 this.map = map;
28 }
29
30 public LuaTable(Set<Object> set) {
31 map = new HashMap<Object,Object>();
32 for( Object obj : set ) {
33 map.put(obj,Boolean.TRUE);
34 }
35 }
36
37 boolean isList() {
38 return map==null || map.isEmpty();
39 }
40
41 List<Object> asList() {
42 return list!=null ? list : Collections.emptyList();
43 }
44
45 Map<Object,Object> asMap() {
46 if( list == null || list.isEmpty() )
47 return map!=null ? map : Collections.emptyMap();
48 Map<Object,Object> rtn = map!=null ? new HashMap<Object,Object>(map) : new HashMap<Object,Object>();
49 for( ListIterator iter = list.listIterator(); iter.hasNext(); ) {
50 int i = iter.nextIndex();
51 rtn.put(i+1,iter.next());
52 }
53 return rtn;
54 }
55
56 boolean isSet() {
57 if( list != null ) {
58 for( Object obj : list ) {
59 if( obj!=null && !obj.equals(Boolean.TRUE) )
60 return false;
61 }
62 }
63 if( map != null ) {
64 for( Object obj : map.values() ) {
65 if( !obj.equals(Boolean.TRUE) )
66 return false;
67 }
68 }
69 return true;
70 }
71
72 Set<Object> asSet() {
73 if( list == null || list.isEmpty() )
74 return map!=null ? map.keySet() : Collections.emptySet();
75 Set<Object> rtn = map!=null ? new HashSet<Object>(map.keySet()) : new HashSet<Object>();
76 for( int i=1; i<=list.size(); i++ ) {
77 rtn.add(i);
78 }
79 return rtn;
80 }
81
24 @Override public String toString() { 82 @Override public String toString() {
25 return "table: " + Integer.toHexString(hashCode()); 83 // return "table: " + Integer.toHexString(hashCode());
84 StringBuilder sb = new StringBuilder();
85 sb.append('{');
86 boolean isFirst = true;
87 if( list != null ) {
88 boolean gotNull = false;
89 for( int i=0; i<list.size(); i++ ) {
90 Object obj = list.get(i);
91 if( obj==null ) {
92 gotNull = true;
93 } else {
94 if( isFirst ) {
95 isFirst = false;
96 } else {
97 sb.append(", ");
98 }
99 if( gotNull )
100 sb.append(i+1).append('=');
101 sb.append(obj);
102 }
103 }
104 }
105 if( map != null ) {
106 for( Map.Entry<Object,Object> entry : map.entrySet() ) {
107 if( isFirst ) {
108 isFirst = false;
109 } else {
110 sb.append(", ");
111 }
112 sb.append(entry.getKey()).append('=').append(entry.getValue());
113 }
114 }
115 sb.append('}');
116 return sb.toString();
26 } 117 }
27 118
28 public Object get(Object key) { 119 public Object get(Object key) {
29 if( list != null ) { 120 if( list != null ) {
30 Integer iT = Lua.asInteger(key); 121 Integer iT = Lua.asInteger(key);
41 132
42 public Object put(Object key,Object val) { 133 public Object put(Object key,Object val) {
43 Integer iT = Lua.asInteger(key); 134 Integer iT = Lua.asInteger(key);
44 if( iT != null ) { 135 if( iT != null ) {
45 int i = iT - 1; 136 int i = iT - 1;
46 if( list == null && i == 0 ) 137 if( list != null || i == 0 ) {
47 list = new ArrayList<Object>(); 138 if( i == list().size() ) {
48 if( list != null ) {
49 if( i == list.size() ) {
50 if( val != null ) { 139 if( val != null ) {
51 list.add(val); 140 list.add(val);
52 if( map != null ) { 141 mapToList();
53 while(true) {
54 Object v = map.remove(Double.valueOf(list.size()+1));
55 if( v == null )
56 break;
57 list.add(v);
58 }
59 }
60 } 142 }
61 return null; 143 return null;
62 } else if( i>=0 && i<list.size() ) { 144 } else if( i>=0 && i<list.size() ) {
63 Object old = list.get(i); 145 Object old = list.get(i);
64 list.set(i,val); 146 list.set(i,val);
83 } else { 165 } else {
84 return map.put(key,val); 166 return map.put(key,val);
85 } 167 }
86 } 168 }
87 169
170 private void mapToList() {
171 if( map != null ) {
172 while(true) {
173 Object v = map.remove(Double.valueOf(list.size()+1));
174 if( v == null )
175 break;
176 list.add(v);
177 }
178 }
179 }
180
181 private List<Object> list() {
182 if( list == null ) {
183 list = new ArrayList<Object>();
184 mapToList();
185 }
186 return list;
187 }
188
88 public void insert(int pos,Object value) { 189 public void insert(int pos,Object value) {
89 if( list == null ) 190 list().add(pos-1,value);
90 list = new ArrayList<Object>();
91 list.add(pos-1,value);
92 } 191 }
93 192
94 public Object remove(int pos) { 193 public Object remove(int pos) {
95 if( list == null ) 194 return list().remove(pos-1);
96 list = new ArrayList<Object>();
97 return list.remove(pos-1);
98 } 195 }
99 196
100 public void sort(Comparator<Object> cmp) { 197 public void sort(Comparator<Object> cmp) {
101 if( list != null ) 198 Collections.sort(list(),cmp);
102 Collections.sort(list,cmp);
103 } 199 }
104 200
105 public int length() { 201 public int length() {
106 return list==null ? 0 : list.size(); 202 return list==null ? 0 : list.size();
107 } 203 }
156 public Object[] listToArray() { 252 public Object[] listToArray() {
157 return list==null ? new Object[0] : list.toArray(); 253 return list==null ? new Object[0] : list.toArray();
158 } 254 }
159 255
160 public LuaTable subList(int from,int to) { 256 public LuaTable subList(int from,int to) {
161 if( list == null ) 257 return new LuaTable(new ArrayList<Object>(list().subList(from-1,to-1)));
162 list = new ArrayList<Object>();
163 return new LuaTable(new ArrayList<Object>(list.subList(from-1,to-1)));
164 } 258 }
165 259
166 public LuaTable getMetatable() { 260 public LuaTable getMetatable() {
167 return metatable; 261 return metatable;
168 } 262 }