diff 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
line wrap: on
line diff
--- a/src/luan/LuaTable.java	Thu Dec 27 01:48:36 2012 +0000
+++ b/src/luan/LuaTable.java	Thu Dec 27 04:36:44 2012 +0000
@@ -8,6 +8,8 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Set;
+import java.util.HashSet;
 
 
 public class LuaTable {
@@ -21,8 +23,97 @@
 		this.list = list;
 	}
 
+	public LuaTable(Map<Object,Object> map) {
+		this.map = map;
+	}
+
+	public LuaTable(Set<Object> set) {
+		map = new HashMap<Object,Object>();
+		for( Object obj : set ) {
+			map.put(obj,Boolean.TRUE);
+		}
+	}
+
+	boolean isList() {
+		return map==null || map.isEmpty();
+	}
+
+	List<Object> asList() {
+		return list!=null ? list : Collections.emptyList();
+	}
+
+	Map<Object,Object> asMap() {
+		if( list == null || list.isEmpty() )
+			return map!=null ? map : Collections.emptyMap();
+		Map<Object,Object> rtn = map!=null ? new HashMap<Object,Object>(map) : new HashMap<Object,Object>();
+		for( ListIterator iter = list.listIterator(); iter.hasNext(); ) {
+			int i = iter.nextIndex();
+			rtn.put(i+1,iter.next());
+		}
+		return rtn;
+	}
+
+	boolean isSet() {
+		if( list != null ) {
+			for( Object obj : list ) {
+				if( obj!=null && !obj.equals(Boolean.TRUE) )
+					return false;
+			}
+		}
+		if( map != null ) {
+			for( Object obj : map.values() ) {
+				if( !obj.equals(Boolean.TRUE) )
+					return false;
+			}
+		}
+		return true;
+	}
+
+	Set<Object> asSet() {
+		if( list == null || list.isEmpty() )
+			return map!=null ? map.keySet() : Collections.emptySet();
+		Set<Object> rtn = map!=null ? new HashSet<Object>(map.keySet()) : new HashSet<Object>();
+		for( int i=1; i<=list.size(); i++ ) {
+			rtn.add(i);
+		}
+		return rtn;
+	}
+
 	@Override public String toString() {
-		return "table: " + Integer.toHexString(hashCode());
+//		return "table: " + Integer.toHexString(hashCode());
+		StringBuilder sb = new StringBuilder();
+		sb.append('{');
+		boolean isFirst = true;
+		if( list != null ) {
+			boolean gotNull = false;
+			for( int i=0; i<list.size(); i++ ) {
+				Object obj = list.get(i);
+				if( obj==null ) {
+					gotNull = true;
+				} else {
+					if( isFirst ) {
+						isFirst = false;
+					} else {
+						sb.append(", ");
+					}
+					if( gotNull )
+						sb.append(i+1).append('=');
+					sb.append(obj);
+				}
+			}
+		}
+		if( map != null ) {
+			for( Map.Entry<Object,Object> entry : map.entrySet() ) {
+				if( isFirst ) {
+					isFirst = false;
+				} else {
+					sb.append(", ");
+				}
+				sb.append(entry.getKey()).append('=').append(entry.getValue());
+			}
+		}
+		sb.append('}');
+		return sb.toString();
 	}
 
 	public Object get(Object key) {
@@ -43,20 +134,11 @@
 		Integer iT = Lua.asInteger(key);
 		if( iT != null ) {
 			int i = iT - 1;
-			if( list == null && i == 0 )
-				list = new ArrayList<Object>();
-			if( list != null ) {
-				if( i == list.size() ) {
+			if( list != null || i == 0 ) {
+				if( i == list().size() ) {
 					if( val != null ) {
 						list.add(val);
-						if( map != null ) {
-							while(true) {
-								Object v = map.remove(Double.valueOf(list.size()+1));
-								if( v == null )
-									break;
-								list.add(v);
-							}
-						}
+						mapToList();
 					}
 					return null;
 				} else if( i>=0 && i<list.size() ) {
@@ -85,21 +167,35 @@
 		}
 	}
 
+	private void mapToList() {
+		if( map != null ) {
+			while(true) {
+				Object v = map.remove(Double.valueOf(list.size()+1));
+				if( v == null )
+					break;
+				list.add(v);
+			}
+		}
+	}
+
+	private List<Object> list() {
+		if( list == null ) {
+			list = new ArrayList<Object>();
+			mapToList();
+		}
+		return list;
+	}
+
 	public void insert(int pos,Object value) {
-		if( list == null )
-			list = new ArrayList<Object>();
-		list.add(pos-1,value);
+		list().add(pos-1,value);
 	}
 
 	public Object remove(int pos) {
-		if( list == null )
-			list = new ArrayList<Object>();
-		return list.remove(pos-1);
+		return list().remove(pos-1);
 	}
 
 	public void sort(Comparator<Object> cmp) {
-		if( list != null )
-			Collections.sort(list,cmp);
+		Collections.sort(list(),cmp);
 	}
 
 	public int length() {
@@ -158,9 +254,7 @@
 	}
 
 	public LuaTable subList(int from,int to) {
-		if( list == null )
-			list = new ArrayList<Object>();
-		return new LuaTable(new ArrayList<Object>(list.subList(from-1,to-1)));
+		return new LuaTable(new ArrayList<Object>(list().subList(from-1,to-1)));
 	}
 
 	public LuaTable getMetatable() {