001    package railo.commons.collections;
002    
003    import java.util.Map;
004    
005    import railo.runtime.type.Collection;
006    import railo.runtime.type.KeyImpl;
007    
008    public final class BinaryTreeMap {
009    
010            private final BinEntry root=new BinEntry(new DummyKey(),null);
011            
012            public Object get(String key) {
013                    return get(KeyImpl.init(key));
014            }
015            
016            public Object get(Collection.Key key) {
017                    BinEntry e = root;
018                    int outer=key.getId(),inner;
019                    while(true) {
020                            if(e==null) return null;
021                            if((inner=e.key.getId())==outer) return e.value;
022                            if(inner>outer) e=e.left;
023                            else e=e.right;
024                    }       
025            }
026    
027            public Object put(String key, Object value) {
028                    return put(KeyImpl.init(key), value);
029            }
030            
031            public Object put(Collection.Key key, Object value) {
032                    BinEntry e = root;
033                    int outer=key.getId(),inner;
034                    while(true) {
035                            if((inner=e.key.getId())==outer) {
036                                    return e.value=value;
037                            }
038                            if(inner>outer) {
039                                    if(e.left==null) {
040                                            e.left=new BinEntry(key,value);
041                                            return value;
042                                    }
043                                    e=e.left;
044                            }
045                            else {
046                                    if(e.right==null) {
047                                            e.right=new BinEntry(key,value);
048                                            return value;
049                                    }
050                                    e=e.right;
051                            }
052                    }
053            }
054            
055            class BinEntry implements Map.Entry {
056    
057                    private Collection.Key key;
058                    private Object value;
059                    private BinEntry left;
060                    private BinEntry right;
061    
062                    private BinEntry(Collection.Key key, Object value) {
063                            this.key=key;
064                            this.value=value;
065                    }
066    
067                    @Override
068                    public Object getKey() {
069                            return key.getString();
070                    }
071    
072                    @Override
073                    public Object getValue() {
074                            return value;
075                    }
076    
077                    @Override
078                    public Object setValue(Object value) {
079                            Object old=value;
080                            this.value=value;
081                            return old;
082                    }
083                    
084                    @Override
085                    public String toString() {
086                            return key+"="+value;
087                    }
088                    
089            }
090            
091            class DummyKey implements Collection.Key {
092    
093                    public char charAt(int index) {return 0;}
094                    public boolean equalsIgnoreCase(Collection.Key obj) {return false;}
095                    public int getId() {return 0;}
096                    public String getLowerString() {return null;}
097                    public String getString() {return null;}
098                    public char lowerCharAt(int index) {return 0;}
099                    public String getUpperString() {return null;}
100                    public char upperCharAt(int index) {return 0;}
101                    public int length() {return 0;}
102                    
103            }
104    }