comparison core/src/luan/AbstractLuanTable.java @ 284:8870840251ea

use LinkedHashMap in LuanTable to preserve order git-svn-id: https://luan-java.googlecode.com/svn/trunk@285 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Tue, 02 Dec 2014 03:55:33 +0000
parents 8afe9f2fdfec
children 9fb523472035
comparison
equal deleted inserted replaced
283:b669cdaf54b7 284:8870840251ea
1 package luan; 1 package luan;
2 2
3 import java.util.Iterator; 3 import java.util.Iterator;
4 import java.util.ListIterator; 4 import java.util.ListIterator;
5 import java.util.Map; 5 import java.util.Map;
6 import java.util.HashMap; 6 import java.util.LinkedHashMap;
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; 11 import java.util.Set;
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 public abstract class AbstractLuanTable implements LuanTable { 17 public abstract class AbstractLuanTable implements LuanTable {
18
19 protected final Map<Object,Object> newMap() {
20 return new LinkedHashMap<Object,Object>();
21 }
22
23 protected final Map<Object,Object> newMap(Map<Object,Object> map) {
24 return new LinkedHashMap<Object,Object>(map);
25 }
18 26
19 @Override public boolean isEmpty() { 27 @Override public boolean isEmpty() {
20 return isList() && length()==0; 28 return isList() && length()==0;
21 } 29 }
22 30
27 @Override public List<Object> asList() { 35 @Override public List<Object> asList() {
28 return Collections.emptyList(); 36 return Collections.emptyList();
29 } 37 }
30 38
31 @Override public Map<Object,Object> asMap() { 39 @Override public Map<Object,Object> asMap() {
32 Map<Object,Object> map = new HashMap<Object,Object>(); 40 Map<Object,Object> map = newMap();
33 for( Map.Entry<Object,Object> entry : this ) { 41 for( Map.Entry<Object,Object> entry : this ) {
34 map.put(entry.getKey(),entry.getValue()); 42 map.put(entry.getKey(),entry.getValue());
35 } 43 }
36 return map; 44 return map;
37 } 45 }
76 @Override public void setMetatable(LuanTable metatable) { 84 @Override public void setMetatable(LuanTable metatable) {
77 throw new UnsupportedOperationException("can't set a metatable on a "+type()); 85 throw new UnsupportedOperationException("can't set a metatable on a "+type());
78 } 86 }
79 87
80 @Override public LuanTable cloneTable() { 88 @Override public LuanTable cloneTable() {
81 return isList() ? new LuanTableImpl(new ArrayList<Object>(asList())) : new LuanTableImpl(new HashMap<Object,Object>(asMap())); 89 return isList() ? new LuanTableImpl(new ArrayList<Object>(asList())) : new LuanTableImpl(newMap(asMap()));
82 } 90 }
83 } 91 }