diff dwtx/dwtxhelper/Collection.d @ 104:04b47443bb01

Reworked the collection uses to make use of a wrapper collection that is compatible to the Java Collections. These new wrappers now use the tango.util.containers instead of the tango.util.collections.
author Frank Benoit <benoit@tionex.de>
date Thu, 07 Aug 2008 15:01:33 +0200
parents 1082a0fc2bb8
children 8ab6fb387666
line wrap: on
line diff
--- a/dwtx/dwtxhelper/Collection.d	Sun Aug 03 17:01:51 2008 +0200
+++ b/dwtx/dwtxhelper/Collection.d	Thu Aug 07 15:01:33 2008 +0200
@@ -2,20 +2,60 @@
 
 import dwt.dwthelper.utils;
 
+static import tango.core.Exception;
 static import tango.util.container.CircularList;
 static import tango.util.container.HashMap;
 static import tango.util.container.HashSet;
 static import tango.util.container.SortedMap;
 static import tango.util.container.more.Vector;
 
-interface Iterator{
+//     class AListIterator {
+//
+//         ArraySeq!(Object) c;
+//         int i;
+//
+//         this( ArraySeq!(Object) c ){
+//             this.c = c;
+//         }
+//
+//         Object next(){
+//             return c.get(++i);
+//         }
+//         Object previous(){
+//             return c.get(--i);
+//         }
+//
+//         bool hasNext(){
+//             return i+1 < c.size();
+//         }
+//         bool hasPrevious(){
+//             return i > 0;
+//         }
+//
+//         void remove(){
+//             c.removeAt(i);
+//             if( i is c.size() ) i--;
+//         }
+//         int nextIndex(){
+//             return i+1;
+//         }
+//     }
+
+
+interface Iterator {
     public bool hasNext();
     public Object next();
     public void  remove();
 }
 
+interface Enumeration {
+    public bool hasMoreElements();
+    public Object nextElement();
+}
+
 interface Collection {
     public bool     add(Object o);
+    public bool     add(String o);
     public bool    addAll(Collection c);
     public void   clear();
     public bool    contains(Object o);
@@ -25,26 +65,43 @@
     public bool    isEmpty();
     public Iterator   iterator();
     public bool    remove(Object o);
+    public bool    remove(String o);
     public bool    removeAll(Collection c);
     public bool    retainAll(Collection c);
     public int    size();
     public Object[]   toArray();
     public Object[]   toArray(Object[] a);
+
+    // only for D
+    public int opApply (int delegate(ref Object value) dg);
 }
 
 interface Map {
+    interface Entry {
+        int   opEquals(Object o);
+        Object     getKey();
+        Object     getValue();
+        hash_t     toHash();
+        Object     setValue(Object value);
+    }
     public void clear();
     public bool containsKey(Object key);
+    public bool containsKey(String key);
     public bool containsValue(Object value);
     public Set  entrySet();
     public int opEquals(Object o);
     public Object get(Object key);
+    public Object get(String key);
     public hash_t toHash();
     public bool isEmpty();
     public Set    keySet();
     public Object put(Object key, Object value);
+    public Object put(String key, Object value);
+    public Object put(Object key, String value);
+    public Object put(String key, String value);
     public void   putAll(Map t);
     public Object remove(Object key);
+    public Object remove(String key);
     public int    size();
     public Collection values();
 
@@ -56,6 +113,7 @@
 interface List : Collection {
     public void     add(int index, Object element);
     public bool     add(Object o);
+    public bool     add(String o);
     public bool     addAll(Collection c);
     public bool     addAll(int index, Collection c);
     public void     clear();
@@ -72,6 +130,7 @@
     public ListIterator   listIterator(int index);
     public Object   remove(int index);
     public bool     remove(Object o);
+    public bool     remove(String o);
     public bool     removeAll(Collection c);
     public bool     retainAll(Collection c);
     public Object   set(int index, Object element);
@@ -83,23 +142,50 @@
 
 interface Set : Collection {
     public bool     add(Object o);
+    public bool     add(String o);
     public bool     addAll(Collection c);
     public void     clear();
     public bool     contains(Object o);
+    public bool     contains(String o);
     public bool     containsAll(Collection c);
     public int      opEquals(Object o);
     public hash_t   toHash();
     public bool     isEmpty();
     public Iterator iterator();
     public bool     remove(Object o);
+    public bool     remove(String o);
     public bool     removeAll(Collection c);
     public bool     retainAll(Collection c);
     public int      size();
     public Object[] toArray();
     public Object[] toArray(Object[] a);
+    public String   toString();
+
+    // only for D
+    public int opApply (int delegate(ref Object value) dg);
 }
-interface ListIterator {
+
+interface SortedSet : Set {
+    Comparator     comparator();
+    Object         first();
+    SortedSet      headSet(Object toElement);
+    Object         last();
+    SortedSet      subSet(Object fromElement, Object toElement);
+    SortedSet      tailSet(Object fromElement);
+}
+
+interface SortedMap : Map {
+    Comparator     comparator();
+    Object         firstKey();
+    SortedMap      headMap(Object toKey);
+    Object         lastKey();
+    SortedMap      subMap(Object fromKey, Object toKey);
+    SortedMap      tailMap(Object fromKey);
+}
+
+interface ListIterator : Iterator {
     public void   add(Object o);
+    public bool   add(String o);
     public bool   hasNext();
     public bool   hasPrevious();
     public Object next();
@@ -109,32 +195,45 @@
     public void   remove();
     public void   set(Object o);
 }
-class Collections {
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////////////////
+    class MapEntry : Map.Entry {
+        Map map;
+        Object key;
+        private this( Map map, Object key){
+            this.map = map;
+            this.key = key;
+        }
+        public override int opEquals(Object o){
+            if( auto other = cast(MapEntry)o){
 
-    private static List EMPTY_LIST_;
-    public static List EMPTY_LIST(){
-        if( EMPTY_LIST_ is null ){
-            synchronized(Collections.classinfo ){
-                if( EMPTY_LIST_ is null ){
-                    EMPTY_LIST_ = new ArrayList(0);
+                if(( getKey() is null ? other.getKey() is null : getKey() == other.getKey() )  &&
+                   ( getValue() is null ? other.getValue() is null : getValue() == other.getValue() )){
+                    return true;
                 }
+                return false;
             }
+            return false;
+        }
+        public Object getKey(){
+            return key;
         }
-        return EMPTY_LIST_;
+        public Object getValue(){
+            return map.get(key);
+        }
+        public override hash_t toHash(){
+            return ( getKey()   is null ? 0 : getKey().toHash()   ) ^
+                   ( getValue() is null ? 0 : getValue().toHash() );
+        }
+        public Object     setValue(Object value){
+            return map.put( key, value );
+        }
+
     }
 
-    public static List unmodifiableList( List list ){
-        return null;
-    }
-    public static void     sort(List list){
-    }
-    public static void     sort(List list, Comparator c){
-    }
-    static void     reverse(List list) {
-    }
-}
-
 class HashMap : Map {
+    // The HashMap  class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.
     alias tango.util.container.HashMap.HashMap!(Object,Object) MapType;
     private MapType map;
 
@@ -142,13 +241,14 @@
         map = new MapType();
     }
     public this(int initialCapacity){
-        implMissing( __FILE__, __LINE__ );
+        this();
     }
     public this(int initialCapacity, float loadFactor){
-        implMissing( __FILE__, __LINE__ );
+        map = new MapType(loadFactor);
     }
     public this(Map m){
-        implMissing( __FILE__, __LINE__ );
+        this();
+        putAll(m);
     }
     public void clear(){
         map.clear();
@@ -157,12 +257,18 @@
         Object v;
         return map.get(key, v );
     }
+    public bool containsKey(String key){
+        return containsKey(stringcast(key));
+    }
     public bool containsValue(Object value){
         return map.contains(value);
     }
     public Set  entrySet(){
-        implMissing( __FILE__, __LINE__ );
-        return null;
+        HashSet res = new HashSet();
+        foreach( k, v; map ){
+            res.add( new MapEntry(this,k));
+        }
+        return res;
     }
     public override int opEquals(Object o){
         if( auto other = cast(HashMap) o ){
@@ -185,6 +291,9 @@
         }
         return null;
     }
+    public Object get(String key){
+        return get(stringcast(key));
+    }
     public override hash_t toHash(){
         return super.toHash();
     }
@@ -206,16 +315,34 @@
         map[ key ] = value;
         return res;
     }
+    public Object put(String key, Object value){
+        return put( stringcast(key), value );
+    }
+    public Object put(Object key, String value){
+        return put( key, stringcast(value) );
+    }
+    public Object put(String key, String value){
+        return put( stringcast(key), stringcast(value) );
+    }
     public void   putAll(Map t){
-        implMissing( __FILE__, __LINE__ );
+        foreach( k, v; t ){
+            map[k] = v;
+        }
     }
     public Object remove(Object key){
-        implMissing( __FILE__, __LINE__ );
+        if( auto v = key in map ){
+            Object res = *v;
+            map.remove(key);
+            return res;
+        }
+        map.remove(key);
         return null;
     }
+    public Object remove(String key){
+        return remove(stringcast(key));
+    }
     public int    size(){
-        implMissing( __FILE__, __LINE__ );
-        return 0;
+        return map.size();
     }
     public Collection values(){
         ArrayList res = new ArrayList( size() );
@@ -234,7 +361,218 @@
 
 }
 
-class TreeMap : Map {
+class Dictionary {
+    public this(){
+    }
+    abstract  Enumeration   elements();
+    abstract  Object        get(Object key);
+    Object        get(String key){
+        return get(stringcast(key));
+    }
+    abstract  bool          isEmpty();
+    abstract  Enumeration   keys();
+    abstract  Object        put(Object key, Object value);
+    public Object put(String key, Object value){
+        return put(stringcast(key), value);
+    }
+    public Object put(Object key, String value){
+        return put(key, stringcast(value));
+    }
+    public Object put(String key, String value){
+        return put(stringcast(key), stringcast(value));
+    }
+    abstract  Object        remove(Object key);
+    public Object remove(String key){
+        return remove(stringcast(key));
+    }
+    abstract  int   size();
+}
+
+class Hashtable : Dictionary, Map {
+
+    public Object        get(String key){
+        return super.get(key);
+    }
+    public Object put(String key, Object value){
+        return super.put(key, value);
+    }
+    public Object put(Object key, String value){
+        return super.put(key, value);
+    }
+    public Object put(String key, String value){
+        return super.put(key, value);
+    }
+    public Object remove(String key){
+        return super.remove(key);
+    }
+
+    // The HashMap  class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.
+    public this(){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public this(int initialCapacity){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public this(int initialCapacity, float loadFactor){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public this(Map t){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    Enumeration  elements(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    Enumeration        keys() {
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public void clear(){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public bool containsKey(Object key){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public bool containsKey(String key){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public bool containsValue(Object value){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public Set  entrySet(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public int opEquals(Object o){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public Object get(Object key){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public hash_t toHash(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public bool isEmpty(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public Set    keySet(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public Object put(Object key, Object value){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+//     public Object put(String key, Object value)
+//     public Object put(Object key, String value)
+//     public Object put(String key, String value)
+    public void   putAll(Map t){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public Object remove(Object key){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+//     public Object remove(String key)
+    public int    size(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public Collection values(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    // only for D
+    public int opApply (int delegate(ref Object value) dg){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public int opApply (int delegate(ref Object key, ref Object value) dg){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+
+}
+
+abstract class AbstractMap : Map {
+    public this(){
+        implMissing( __FILE__, __LINE__ );
+    }
+    void   clear(){
+        implMissing( __FILE__, __LINE__ );
+    }
+    protected  Object       clone(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    bool        containsKey(Object key){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    bool        containsValue(Object value){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    abstract  Set   entrySet();
+
+    public override int       opEquals(Object o){
+        if( Map other = cast(Map)o){
+            return entrySet().opEquals( cast(Object) other.entrySet() );
+        }
+        return false;
+    }
+
+    Object         get(Object key){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public override hash_t    toHash(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    bool        isEmpty(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    Set    keySet(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    Object         put(Object key, Object value){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    void   putAll(Map t){
+        implMissing( __FILE__, __LINE__ );
+    }
+    Object         remove(Object key){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    int    size(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    String         toString(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    Collection     values(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+}
+
+class TreeMap : Map, SortedMap {
     alias tango.util.container.SortedMap.SortedMap!(Object,Object) MapType;
     private MapType map;
 
@@ -247,22 +585,32 @@
     public this(Map m){
         implMissing( __FILE__, __LINE__ );
     }
-//     public this(SortedMap m){
-//         implMissing( __FILE__, __LINE__ );
-//     }
+    public this(SortedMap m){
+        implMissing( __FILE__, __LINE__ );
+    }
     public void clear(){
         map.clear();
     }
+    Comparator     comparator(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
     public bool containsKey(Object key){
         Object v;
         return map.get(key, v );
     }
+    public bool containsKey(String key){
+        return containsKey(stringcast(key));
+    }
     public bool containsValue(Object value){
         return map.contains(value);
     }
     public Set  entrySet(){
-        implMissing( __FILE__, __LINE__ );
-        return null;
+        TreeSet res = new TreeSet();
+        foreach( k, v; map ){
+            res.add( new MapEntry(this,k) );
+        }
+        return res;
     }
     public override int opEquals(Object o){
         if( auto other = cast(HashMap) o ){
@@ -279,36 +627,91 @@
         }
         return false;
     }
+    Object         firstKey(){
+        foreach( k; map ){
+            return k;
+        }
+        throw new tango.core.Exception.NoSuchElementException( "TreeMap.firstKey" );
+    }
     public Object get(Object key){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
+    public Object get(String key){
+        return get(stringcast(key));
+    }
     public override hash_t toHash(){
-        return super.toHash();
+        // http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractMap.html#hashCode()
+        hash_t res = 0;
+        foreach( e; entrySet() ){
+            res += e.toHash();
+        }
+        return res;
+    }
+    SortedMap headMap(Object toKey){
+        implMissing( __FILE__, __LINE__ );
+        return null;
     }
     public bool isEmpty(){
         return map.isEmpty();
     }
-    public Set    keySet(){
+    public Set keySet(){
+        TreeSet res = new TreeSet();
+        foreach( k; map ){
+            res.add( k );
+        }
+        return res;
+    }
+    Object lastKey(){
+        Object res;
+        foreach( k; map ){
+            res = k;
+        }
+        if( map.size() ) return res;
+        throw new tango.core.Exception.NoSuchElementException( "TreeMap.lastKey" );
+    }
+    public Object put(Object key, Object value){
+        if( map.contains(key) ){ // TODO if tango has opIn_r, then use the "in" operator
+            Object res = map[key];
+            map[key] = value;
+            return res;
+        }
+        map[key] = value;
+        return null;
+    }
+    public Object put(String key, Object value){
+        return put(stringcast(key), value);
+    }
+    public Object put(Object key, String value){
+        return put(key, stringcast(value));
+    }
+    public Object put(String key, String value){
+        return put(stringcast(key), stringcast(value));
+    }
+    public void   putAll(Map t){
+        foreach( k, v; t ){
+            put( k, v );
+        }
+    }
+    public Object remove(Object key){
+        Object res;
+        map.take(key,res);
+        return res;
+    }
+    public Object remove(String key){
+        return remove(stringcast(key));
+    }
+    public int    size(){
+        return map.size();
+    }
+    SortedMap      subMap(Object fromKey, Object toKey){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
-    public Object put(Object key, Object value){
-        Object res = null;
-        implMissing( __FILE__, __LINE__ );
-        return res;
-    }
-    public void   putAll(Map t){
-        implMissing( __FILE__, __LINE__ );
-    }
-    public Object remove(Object key){
+    SortedMap      tailMap(Object fromKey){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
-    public int    size(){
-        implMissing( __FILE__, __LINE__ );
-        return 0;
-    }
     public Collection values(){
         ArrayList res = new ArrayList( size() );
         foreach( k, v; map ){
@@ -344,6 +747,9 @@
     public bool    add(Object o){
         return set.add(o);
     }
+    public bool    add(String o){
+        return add(stringcast(o));
+    }
     public bool    addAll(Collection c){
         implMissing( __FILE__, __LINE__ );
         return false;
@@ -354,6 +760,9 @@
     public bool    contains(Object o){
         return set.contains(o);
     }
+    public bool     contains(String o){
+        return contains(stringcast(o));
+    }
     public bool    containsAll(Collection c){
         implMissing( __FILE__, __LINE__ );
         return false;
@@ -391,6 +800,9 @@
     public bool    remove(Object o){
         return set.remove(o);
     }
+    public bool remove(String key){
+        return remove(stringcast(key));
+    }
     public bool    removeAll(Collection c){
         implMissing( __FILE__, __LINE__ );
         return false;
@@ -410,23 +822,500 @@
         implMissing( __FILE__, __LINE__ );
         return null;
     }
+    public override String toString(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
 
+    // only for D
+    public int opApply (int delegate(ref Object value) dg){
+        return set.opApply(dg);
+    }
+
+}
+
+abstract class AbstractCollection : Collection {
+    this(){
+    }
+    bool        add(Object o){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    bool        addAll(Collection c){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    void   clear(){
+        implMissing( __FILE__, __LINE__ );
+    }
+    bool        contains(Object o){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    bool        containsAll(Collection c){
+        if( c is null ) throw new NullPointerException();
+        foreach( o; c ){
+            if( !contains(o) ) return false;
+        }
+        return true;
+    }
+    override int opEquals(Object o){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    bool        isEmpty(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    abstract  Iterator      iterator();
+    override hash_t toHash(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    bool        remove(Object o){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    bool        remove(String o){
+        return remove(stringcast(o));
+    }
+    bool        removeAll(Collection c){
+        if( c is null ) throw new NullPointerException();
+        bool res = false;
+        foreach( o; c ){
+            res |= remove(o);
+        }
+        return res;
+    }
+    bool        retainAll(Collection c){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    abstract  int   size();
+    Object[]       toArray(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    Object[]       toArray(Object[] a){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    String         toString(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+}
+
+abstract class AbstractSet : AbstractCollection, Set {
+    this(){
+    }
+    int         opEquals(Object o){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    hash_t      toHash(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    bool        removeAll(Collection c){
+        return super.removeAll(c);
+    }
+    public abstract bool     add(Object o);
+    public abstract bool     add(String o);
+    public abstract bool     addAll(Collection c);
+    public abstract void     clear();
+    public abstract bool     contains(Object o);
+    public abstract bool     contains(String o);
+    public abstract bool     containsAll(Collection c);
+
+
+    public abstract bool     isEmpty();
+    public abstract Iterator iterator();
+    public abstract bool     remove(Object o);
+    public abstract bool     remove(String o);
+    public abstract bool     removeAll(Collection c);
+    public abstract bool     retainAll(Collection c);
+    public abstract int      size();
+    public abstract Object[] toArray();
+    public abstract Object[] toArray(Object[] a);
+    public abstract String   toString(){
+        return super.toString();
+    }
+
+    // only for D
+    public abstract int opApply (int delegate(ref Object value) dg);
+}
+
+abstract class AbstractList : AbstractCollection, List {
+    this(){
+    }
+
+    public abstract void   add(int index, Object element);
+    public abstract bool        add(Object o);
+    public abstract bool     addAll(Collection c);
+    public abstract bool        addAll(int index, Collection c);
+    public abstract void   clear();
+    public abstract bool     contains(Object o);
+    public abstract bool     containsAll(Collection c);
+    public abstract int  opEquals(Object o);
+    public abstract  Object        get(int index);
+
+    public hash_t  toHash(){
+        // http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html#hashCode()
+        hash_t hashCode = 1;
+        Iterator i = iterator();
+        while (i.hasNext()) {
+            Object obj = i.next();
+            hashCode = 31 * hashCode + (obj is null ? 0 : obj.toHash());
+        }
+        return hashCode;
+    }
+
+    public abstract int    indexOf(Object o);
+    public abstract bool     isEmpty();
+    public abstract Iterator       iterator();
+    public abstract int    lastIndexOf(Object o);
+    public abstract ListIterator   listIterator();
+    public abstract ListIterator   listIterator(int index);
+    public abstract Object         remove(int index);
+    protected abstract void         removeRange(int fromIndex, int toIndex);
+    public abstract bool     remove(Object o);
+    public abstract bool     remove(String o);
+    public abstract bool     removeAll(Collection c);
+    public abstract bool     retainAll(Collection c);
+    public abstract Object         set(int index, Object element);
+    public abstract List   subList(int fromIndex, int toIndex);
+    public abstract Object[] toArray();
+    public abstract Object[] toArray(Object[] a);
 
 }
 
+class TreeSet : AbstractSet, SortedSet {
 
-class Vector : List {
-    this(){
+    alias tango.util.container.SortedMap.SortedMap!(Object,int) SetType;
+    private SetType set;
+
+    public this(){
+        set = new SetType();
+    }
+    public this(Collection c){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public this(Comparator c){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public this(SortedSet){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    public bool    add(Object o){
+        return set.add(o, 0);
+    }
+    public bool    add(String o){
+        return add(stringcast(o));
+    }
+    public bool    addAll(Collection c){
+        foreach( o; c ){
+            add(o);
+        }
+        return true;
+    }
+    public void   clear(){
+        set.clear();
+    }
+    public bool    contains(Object o){
+        return set.containsKey(o);
+    }
+    public bool     contains(String o){
+        return contains(stringcast(o));
+    }
+    public bool    containsAll(Collection c){
+        foreach( o; c ){
+            if( !contains(o) ){
+                return false;
+            }
+        }
+        return true;
+    }
+    public Comparator     comparator(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public override int    opEquals(Object o){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public Object         first(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public override hash_t    toHash(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public SortedSet      headSet(Object toElement){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public bool    isEmpty(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public Iterator   iterator(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public Object         last(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public bool    remove(Object o){
+        return false;
+    }
+    public bool remove(String key){
+        return remove(stringcast(key));
+    }
+    public bool    removeAll(Collection c){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public bool    retainAll(Collection c){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public int    size(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public SortedSet      subSet(Object fromElement, Object toElement){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public SortedSet      tailSet(Object fromElement){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public Object[]   toArray(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public Object[]   toArray(Object[] a){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public override String toString(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+
+    // only for D
+    public int opApply (int delegate(ref Object value) dg){
+        int localDg( ref Object key, ref int value ){
+            return dg( key );
+        }
+        return set.opApply(&localDg);
+    }
+}
+
+class Vector : AbstractList, List {
+    public this(){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public this(Collection c){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public this(int initialCapacity){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public this(int initialCapacity, int capacityIncrement){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public void   add(int index, Object element){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public bool    add(Object o){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public bool    add(String o){
+        return add(stringcast(o));
+    }
+    public bool    addAll(Collection c){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public bool    addAll(int index, Collection c){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public void   addElement(Object obj){
         implMissing( __FILE__, __LINE__ );
     }
-    this(Collection c){
+    public int    capacity(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public void   clear(){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public Object     clone(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public bool    contains(Object elem){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public bool    containsAll(Collection c){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public void   copyInto(Object[] anArray){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public Object     elementAt(int index){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public Enumeration    elements(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+   public  void   ensureCapacity(int minCapacity){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public int opEquals(Object o){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public Object     firstElement(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public Object     get(int index){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public hash_t    toHash(){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public int    indexOf(Object elem){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public int    indexOf(Object elem, int index){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public void   insertElementAt(Object obj, int index){
         implMissing( __FILE__, __LINE__ );
     }
-    this(int initialCapacity){
+    public bool    isEmpty(){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public Iterator   iterator(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public Object     lastElement(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public int    lastIndexOf(Object elem){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public int    lastIndexOf(Object elem, int index){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public ListIterator   listIterator(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public ListIterator   listIterator(int index){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public Object     remove(int index){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public bool    remove(Object o){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public bool remove(String key){
+        return remove(stringcast(key));
+    }
+    public bool    removeAll(Collection c){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public void   removeAllElements(){
         implMissing( __FILE__, __LINE__ );
     }
-    this(int initialCapacity, int capacityIncrement){
+    public bool    removeElement(Object obj){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public void   removeElementAt(int index){
+        implMissing( __FILE__, __LINE__ );
+    }
+    protected  void     removeRange(int fromIndex, int toIndex){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public bool    retainAll(Collection c){
+        implMissing( __FILE__, __LINE__ );
+        return false;
+    }
+    public Object     set(int index, Object element){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public void   setElementAt(Object obj, int index){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public void   setSize(int newSize){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public int    size(){
         implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+    public List   subList(int fromIndex, int toIndex){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public Object[]   toArray(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public Object[]   toArray(Object[] a){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public String     toString(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public void   trimToSize(){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    // only for D
+    public int opApply (int delegate(ref Object value) dg){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+
+}
+
+class Stack : Vector {
+    this(){
     }
     void   add(int index, Object element){
         implMissing( __FILE__, __LINE__ );
@@ -435,6 +1324,9 @@
         implMissing( __FILE__, __LINE__ );
         return false;
     }
+    public bool    add(String o){
+        return add(stringcast(o));
+    }
     bool    addAll(Collection c){
         implMissing( __FILE__, __LINE__ );
         return false;
@@ -542,177 +1434,8 @@
         implMissing( __FILE__, __LINE__ );
         return false;
     }
-    bool    removeAll(Collection c){
-        implMissing( __FILE__, __LINE__ );
-        return false;
-    }
-    void   removeAllElements(){
-        implMissing( __FILE__, __LINE__ );
-    }
-    bool    removeElement(Object obj){
-        implMissing( __FILE__, __LINE__ );
-        return false;
-    }
-    void   removeElementAt(int index){
-        implMissing( __FILE__, __LINE__ );
-    }
-    protected  void     removeRange(int fromIndex, int toIndex){
-        implMissing( __FILE__, __LINE__ );
-    }
-    bool    retainAll(Collection c){
-        implMissing( __FILE__, __LINE__ );
-        return false;
-    }
-    Object     set(int index, Object element){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    void   setElementAt(Object obj, int index){
-        implMissing( __FILE__, __LINE__ );
-    }
-    void   setSize(int newSize){
-        implMissing( __FILE__, __LINE__ );
-    }
-    int    size(){
-        implMissing( __FILE__, __LINE__ );
-        return 0;
-    }
-    List   subList(int fromIndex, int toIndex){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    Object[]   toArray(){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    Object[]   toArray(Object[] a){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    String     toString(){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    void   trimToSize(){
-        implMissing( __FILE__, __LINE__ );
-    }
-}
-class Stack : Vector {
-    this(){
-    }
-    void   add(int index, Object element){
-        implMissing( __FILE__, __LINE__ );
-    }
-    bool    add(Object o){
-        implMissing( __FILE__, __LINE__ );
-        return false;
-    }
-    bool    addAll(Collection c){
-        implMissing( __FILE__, __LINE__ );
-        return false;
-    }
-    bool    addAll(int index, Collection c){
-        implMissing( __FILE__, __LINE__ );
-        return false;
-    }
-    void   addElement(Object obj){
-        implMissing( __FILE__, __LINE__ );
-    }
-    int    capacity(){
-        implMissing( __FILE__, __LINE__ );
-        return 0;
-    }
-    void   clear(){
-        implMissing( __FILE__, __LINE__ );
-    }
-    Object     clone(){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    bool    contains(Object elem){
-        implMissing( __FILE__, __LINE__ );
-        return false;
-    }
-    bool    containsAll(Collection c){
-        implMissing( __FILE__, __LINE__ );
-        return false;
-    }
-    void   copyInto(Object[] anArray){
-        implMissing( __FILE__, __LINE__ );
-    }
-    Object     elementAt(int index){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-//     Enumeration    elements(){
-//         implMissing( __FILE__, __LINE__ );
-//         return null;
-//     }
-    void   ensureCapacity(int minCapacity){
-        implMissing( __FILE__, __LINE__ );
-    }
-    int opEquals(Object o){
-        implMissing( __FILE__, __LINE__ );
-        return false;
-    }
-    Object     firstElement(){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    Object     get(int index){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    hash_t    toHash(){
-        implMissing( __FILE__, __LINE__ );
-        return 0;
-    }
-    int    indexOf(Object elem){
-        implMissing( __FILE__, __LINE__ );
-        return 0;
-    }
-    int    indexOf(Object elem, int index){
-        implMissing( __FILE__, __LINE__ );
-        return 0;
-    }
-    void   insertElementAt(Object obj, int index){
-        implMissing( __FILE__, __LINE__ );
-    }
-    bool    isEmpty(){
-        implMissing( __FILE__, __LINE__ );
-        return false;
-    }
-    Iterator   iterator(){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    Object     lastElement(){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    int    lastIndexOf(Object elem){
-        implMissing( __FILE__, __LINE__ );
-        return 0;
-    }
-    int    lastIndexOf(Object elem, int index){
-        implMissing( __FILE__, __LINE__ );
-        return 0;
-    }
-    ListIterator   listIterator(){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    ListIterator   listIterator(int index){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    Object     remove(int index){
-        implMissing( __FILE__, __LINE__ );
-        return null;
-    }
-    bool    remove(Object o){
-        implMissing( __FILE__, __LINE__ );
-        return false;
+    public bool remove(String key){
+        return remove(stringcast(key));
     }
     bool    removeAll(Collection c){
         implMissing( __FILE__, __LINE__ );
@@ -790,52 +1513,83 @@
         implMissing( __FILE__, __LINE__ );
         return 0;
     }
+
+    // only for D
+    public int opApply (int delegate(ref Object value) dg){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+
 }
 
 class LinkedList : List {
+    alias tango.util.container.CircularList.CircularList!(Object) ListType;
+    private ListType list;
+
+    this(){
+        list = new ListType();
+    }
+    this( Collection c ){
+        this();
+        addAll(c);
+    }
     void   add(int index, Object element){
-        implMissing( __FILE__, __LINE__ );
+        list.addAt(index,element);
+        return true;
     }
     bool    add(Object o){
-        implMissing( __FILE__, __LINE__ );
-        return false;
+        list.add(o);
+        return true;
+    }
+    public bool    add(String o){
+        return add(stringcast(o));
     }
     bool    addAll(Collection c){
-        implMissing( __FILE__, __LINE__ );
-        return false;
+        if( c is null ) throw new NullPointerException();
+        bool res = false;
+        foreach( o; c ){
+            res |= add( o );
+        }
+        return res;
     }
     bool    addAll(int index, Collection c){
         implMissing( __FILE__, __LINE__ );
         return false;
     }
-    void   addElement(Object obj){
-        implMissing( __FILE__, __LINE__ );
+    void   addFirst(Object o){
+        list.prepend( o );
     }
+    void   addLast(Object o){
+        list.append( o );
+    }
+//     void   addElement(Object obj){
+//         implMissing( __FILE__, __LINE__ );
+//     }
     int    capacity(){
         implMissing( __FILE__, __LINE__ );
         return 0;
     }
     void   clear(){
-        implMissing( __FILE__, __LINE__ );
+        list.clear();
     }
     Object     clone(){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
     bool    contains(Object elem){
-        implMissing( __FILE__, __LINE__ );
-        return false;
+        return list.contains(elem);
     }
     bool    containsAll(Collection c){
-        implMissing( __FILE__, __LINE__ );
-        return false;
+        foreach(o; c){
+            if( !list.contains(o)) return false;
+        }
+        return true;
     }
     void   copyInto(Object[] anArray){
         implMissing( __FILE__, __LINE__ );
     }
     Object     elementAt(int index){
-        implMissing( __FILE__, __LINE__ );
-        return null;
+        return list.get(index);
     }
 //     Enumeration    elements(){
 //         implMissing( __FILE__, __LINE__ );
@@ -907,6 +1661,9 @@
         implMissing( __FILE__, __LINE__ );
         return false;
     }
+    public bool remove(String key){
+        return remove(stringcast(key));
+    }
     bool    removeAll(Collection c){
         implMissing( __FILE__, __LINE__ );
         return false;
@@ -914,6 +1671,14 @@
     void   removeAllElements(){
         implMissing( __FILE__, __LINE__ );
     }
+    Object     removeFirst(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    Object     removeLast(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
     bool    removeElement(Object obj){
         implMissing( __FILE__, __LINE__ );
         return false;
@@ -947,12 +1712,10 @@
         return null;
     }
     Object[]   toArray(){
-        implMissing( __FILE__, __LINE__ );
-        return null;
+        return list.toArray();
     }
     Object[]   toArray(Object[] a){
-        implMissing( __FILE__, __LINE__ );
-        return null;
+        return list.toArray( a );
     }
     String     toString(){
         implMissing( __FILE__, __LINE__ );
@@ -961,9 +1724,16 @@
     void   trimToSize(){
         implMissing( __FILE__, __LINE__ );
     }
+
+    // only for D
+    public int opApply (int delegate(ref Object value) dg){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+
 }
 
-class ArrayList : List {
+class ArrayList : AbstractList, List {
     private Object[] data;
 
     this(){
@@ -984,6 +1754,9 @@
         data ~= o;
         return true;
     }
+    public bool    add(String o){
+        return add(stringcast(o));
+    }
     bool    addAll(Collection c){
         implMissing( __FILE__, __LINE__ );
         return false;
@@ -995,6 +1768,10 @@
     void   clear(){
         data.length = 0;
     }
+    ArrayList clone(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
     bool    contains(Object o){
         foreach( v; data ){
             if( o is v ){
@@ -1111,6 +1888,9 @@
         implMissing( __FILE__, __LINE__ );
         return false;
     }
+    public bool remove(String key){
+        return remove(stringcast(key));
+    }
     bool    removeAll(Collection c){
         implMissing( __FILE__, __LINE__ );
         return false;
@@ -1119,6 +1899,9 @@
         implMissing( __FILE__, __LINE__ );
         return false;
     }
+    protected  void     removeRange(int fromIndex, int toIndex){
+        implMissing( __FILE__, __LINE__ );
+    }
     Object     set(int index, Object element){
         Object res = data[index];
         data[index] = element;
@@ -1132,10 +1915,127 @@
         return null;
     }
     Object[]   toArray(){
+        return data.dup;
+    }
+    Object[]   toArray(Object[] a){
+        if( data.length <= a.length ){
+            a[ 0 .. data.length ] = data;
+        }
+        else{
+            return data.dup;
+        }
+        if( data.length < a.length ){
+            a[data.length] = null;
+        }
+        return a;
+    }
+
+    // only for D
+    public int opApply (int delegate(ref Object value) dg){
+        implMissing( __FILE__, __LINE__ );
+        return 0;
+    }
+}
+
+class Arrays {
+    public static bool equals(Object[] a, Object[] b){
+        if( a.length !is b.length ){
+            return false;
+        }
+        for( int i = 0; i < a.length; i++ ){
+            if( a[i] is null && b[i] is null ){
+                continue;
+            }
+            if( a[i] !is null && b[i] !is null && a[i] == b[i] ){
+                continue;
+            }
+            return false;
+        }
+        return true;
+    }
+    static List    asList(Object[] a) {
+        if( a.length is 0 ) return Collections.EMPTY_LIST;
+        ArrayList res = new ArrayList( a.length );
+        foreach( o; a ){
+            res.add(o);
+        }
+        return res;
+    }
+}
+
+class Collections {
+
+    private static List EMPTY_LIST_;
+    public static List EMPTY_LIST(){
+        if( EMPTY_LIST_ is null ){
+            synchronized(Collections.classinfo ){
+                if( EMPTY_LIST_ is null ){
+                    EMPTY_LIST_ = new ArrayList(0);
+                }
+            }
+        }
+        return EMPTY_LIST_;
+    }
+    public static Map EMPTY_MAP(){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
-    Object[]   toArray(Object[] a){
+    public static Set EMPTY_SET(){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+
+    public static List unmodifiableList( List list ){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public static Map unmodifiableMap( Map list ){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public static Set unmodifiableSet( Set list ){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public static Set singleton( Object o ){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    public static void     sort(List list){
+        implMissing( __FILE__, __LINE__ );
+    }
+    public static void     sort(List list, Comparator c){
+        implMissing( __FILE__, __LINE__ );
+    }
+
+    static Collection   synchronizedCollection(Collection c){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    static List     synchronizedList(List list){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    static Map  synchronizedMap(Map m){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+    static Set  synchronizedSet(Set s){
+        implMissing( __FILE__, __LINE__ );
+        return null;
+    }
+//     static SortedMap    synchronizedSortedMap(SortedMap m){
+//         implMissing( __FILE__, __LINE__ );
+//         return null;
+//     }
+//     static SortedSet    synchronizedSortedSet(SortedSet s){
+//         implMissing( __FILE__, __LINE__ );
+//         return null;
+//     }
+    static void     reverse(List list) {
+        implMissing( __FILE__, __LINE__ );
+    }
+    static Enumeration     enumeration(Collection c){
         implMissing( __FILE__, __LINE__ );
         return null;
     }