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 }