1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[The "BSD licence"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCopyright (c) 2005-2007 Kunle Odutola 4324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverAll rights reserved. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRedistribution and use in source and binary forms, with or without 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodification, are permitted provided that the following conditions 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverare met: 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1. Redistributions of source code MUST RETAIN the above copyright 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver notice, this list of conditions and the following disclaimer. 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver2. Redistributions in binary form MUST REPRODUCE the above copyright 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver notice, this list of conditions and the following disclaimer in 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver the documentation and/or other materials provided with the 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver distribution. 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver3. The name of the author may not be used to endorse or promote products 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver derived from this software without specific prior WRITTEN permission. 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver4. Unless explicitly state otherwise, any contribution intentionally 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver submitted for inclusion in this work to the copyright owner or licensor 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver shall be under the terms and conditions of this license, without any 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver additional terms or conditions. 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 22324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/ 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime.Collections 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using System; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using IDictionary = System.Collections.IDictionary; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using IDictionaryEnumerator = System.Collections.IDictionaryEnumerator; 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using ICollection = System.Collections.ICollection; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using IEnumerator = System.Collections.IEnumerator; 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using Hashtable = System.Collections.Hashtable; 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using ArrayList = System.Collections.ArrayList; 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using DictionaryEntry = System.Collections.DictionaryEntry; 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using StringBuilder = System.Text.StringBuilder; 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// An Hashtable-backed dictionary that enumerates Keys and Values in 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// insertion order. 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public sealed class HashList : IDictionary 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region Helper classes 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private sealed class HashListEnumerator : IDictionaryEnumerator 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internal enum EnumerationMode 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Key, 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Value, 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Entry 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private HashList _hashList; 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private ArrayList _orderList; 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private EnumerationMode _mode; 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private int _index; 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private int _version; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private object _key; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private object _value; 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region Constructors 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internal HashListEnumerator() 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _index = 0; 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _key = null; 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _value = null; 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internal HashListEnumerator(HashList hashList, EnumerationMode mode) 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _hashList = hashList; 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _mode = mode; 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _version = hashList._version; 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _orderList = hashList._insertionOrderList; 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _index = 0; 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _key = null; 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _value = null; 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region IDictionaryEnumerator Members 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public object Key 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (_key == null) 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new InvalidOperationException("Enumeration has either not started or has already finished."); 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _key; 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public object Value 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (_key == null) 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new InvalidOperationException("Enumeration has either not started or has already finished."); 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _value; 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public DictionaryEntry Entry 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (_key == null) 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new InvalidOperationException("Enumeration has either not started or has already finished."); 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new DictionaryEntry(_key, _value); 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region IEnumerator Members 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void Reset() 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (_version != _hashList._version) 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new InvalidOperationException("Collection was modified; enumeration operation may not execute."); 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _index = 0; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _key = null; 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _value = null; 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public object Current 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (_key == null) 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new InvalidOperationException("Enumeration has either not started or has already finished."); 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (_mode == EnumerationMode.Key) 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _key; 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (_mode == EnumerationMode.Value) 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _value; 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new DictionaryEntry(_key, _value); 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public bool MoveNext() 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (_version != _hashList._version) 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new InvalidOperationException("Collection was modified; enumeration operation may not execute."); 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (_index < _orderList.Count) 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _key = _orderList[_index]; 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _value = _hashList[_key]; 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _index++; 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _key = null; 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return false; 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private sealed class KeyCollection : ICollection 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private HashList _hashList; 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region Constructors 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internal KeyCollection() 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internal KeyCollection(HashList hashList) 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _hashList = hashList; 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public override string ToString() 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StringBuilder result = new StringBuilder(); 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.Append("["); 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ArrayList keys = _hashList._insertionOrderList; 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i = 0; i < keys.Count; i++) 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i > 0) 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.Append(", "); 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.Append(keys[i]); 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.Append("]"); 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return result.ToString(); 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public override bool Equals(object o) 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (o is KeyCollection) 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver KeyCollection other = (KeyCollection) o; 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ((Count == 0) && (other.Count == 0)) 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (Count == other.Count) 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i = 0; i < Count; i++) 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ((_hashList._insertionOrderList[i] == other._hashList._insertionOrderList[i]) || 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (_hashList._insertionOrderList[i].Equals(other._hashList._insertionOrderList[i]))) 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return false; 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public override int GetHashCode() 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _hashList._insertionOrderList.GetHashCode(); 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region ICollection Members 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public bool IsSynchronized 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return _hashList.IsSynchronized; } 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int Count 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return _hashList.Count; } 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void CopyTo(Array array, int index) 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _hashList.CopyKeysTo(array, index); 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public object SyncRoot 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return _hashList.SyncRoot; } 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region IEnumerable Members 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public IEnumerator GetEnumerator() 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new HashListEnumerator(_hashList, HashListEnumerator.EnumerationMode.Key); 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private sealed class ValueCollection : ICollection 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private HashList _hashList; 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region Constructors 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internal ValueCollection() 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internal ValueCollection(HashList hashList) 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _hashList = hashList; 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public override string ToString() 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StringBuilder result = new StringBuilder(); 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.Append("["); 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IEnumerator iter = new HashListEnumerator(_hashList, HashListEnumerator.EnumerationMode.Value); 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (iter.MoveNext()) 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.Append((iter.Current == null) ? "null" : iter.Current); 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (iter.MoveNext()) 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.Append(", "); 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.Append((iter.Current == null) ? "null" : iter.Current); 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.Append("]"); 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return result.ToString(); 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region ICollection Members 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public bool IsSynchronized 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return _hashList.IsSynchronized; } 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int Count 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return _hashList.Count; } 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void CopyTo(Array array, int index) 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _hashList.CopyValuesTo(array, index); 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public object SyncRoot 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return _hashList.SyncRoot; } 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region IEnumerable Members 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public IEnumerator GetEnumerator() 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new HashListEnumerator(_hashList, HashListEnumerator.EnumerationMode.Value); 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private Hashtable _dictionary = new Hashtable(); 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private ArrayList _insertionOrderList = new ArrayList(); 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private int _version; 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region Constructors 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public HashList() : this(-1) 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public HashList(int capacity) 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (capacity < 0) 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _dictionary = new Hashtable(); 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _insertionOrderList = new ArrayList(); 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _dictionary = new Hashtable(capacity); 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _insertionOrderList = new ArrayList(capacity); 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _version = 0; 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region IDictionary Members 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public bool IsReadOnly { get { return _dictionary.IsReadOnly; } } 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public IDictionaryEnumerator GetEnumerator() 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new HashListEnumerator(this, HashListEnumerator.EnumerationMode.Entry); 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public object this[object key] 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return _dictionary[key]; } 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver set 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver bool isNewEntry = !_dictionary.Contains(key); 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _dictionary[key] = value; 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (isNewEntry) 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _insertionOrderList.Add(key); 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _version++; 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void Remove(object key) 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _dictionary.Remove(key); 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _insertionOrderList.Remove(key); 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _version++; 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public bool Contains(object key) 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return _dictionary.Contains(key); 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void Clear() 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _dictionary.Clear(); 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _insertionOrderList.Clear(); 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _version++; 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public ICollection Values 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return new ValueCollection(this); } 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void Add(object key, object value) 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _dictionary.Add(key, value); 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _insertionOrderList.Add(key); 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _version++; 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public ICollection Keys 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return new KeyCollection(this); } 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public bool IsFixedSize 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return _dictionary.IsFixedSize; } 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region ICollection Members 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public bool IsSynchronized 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return _dictionary.IsSynchronized; } 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int Count 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return _dictionary.Count; } 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void CopyTo(Array array, int index) 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int len = _insertionOrderList.Count; 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i = 0; i < len; i++) 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DictionaryEntry e = new DictionaryEntry(_insertionOrderList[i], _dictionary[_insertionOrderList[i]]); 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver array.SetValue(e, index++); 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public object SyncRoot 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { return _dictionary.SyncRoot; } 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region IEnumerable Members 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IEnumerator System.Collections.IEnumerable.GetEnumerator() 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new HashListEnumerator(this, HashListEnumerator.EnumerationMode.Entry); 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private void CopyKeysTo(Array array, int index) 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int len = _insertionOrderList.Count; 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i = 0; i < len; i++) 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver array.SetValue(_insertionOrderList[i], index++); 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private void CopyValuesTo(Array array, int index) 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int len = _insertionOrderList.Count; 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i = 0; i < len; i++) 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver array.SetValue(_dictionary[_insertionOrderList[i]], index++); 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}