1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Lextm.SharpSnmpLib.Mib 7 { 8 public class SymbolList : List<Symbol> 9 { 10 public class SymbolEnumerator : ISymbolEnumerator 11 { 12 private SymbolList _list = null; 13 private int _index = -1; 14 SymbolEnumerator(SymbolList list)15 internal SymbolEnumerator(SymbolList list) 16 { 17 if (list == null) 18 { 19 throw new ArgumentNullException("lexer"); 20 } 21 22 _list = list; 23 } 24 25 #region ISymbolEnumerator Member 26 PutBack(Symbol item)27 public bool PutBack(Symbol item) 28 { 29 if ((_index < 0) || (_index >= _list.Count) || (item != _list[_index])) 30 { 31 throw new ArgumentException(@"wrong last symbol", "last"); 32 //return false; 33 } 34 35 _index--; 36 return true; 37 } 38 39 #endregion 40 41 #region IEnumerator<Symbol> Member 42 43 public Symbol Current 44 { 45 get 46 { 47 if ((_index >= 0) && (_index <= _list.Count)) 48 { 49 return _list[_index]; 50 } 51 52 return null; 53 } 54 } 55 56 #endregion 57 58 #region IDisposable Member 59 Dispose()60 public void Dispose() 61 { 62 } 63 64 #endregion 65 66 #region IEnumerator Member 67 68 object System.Collections.IEnumerator.Current 69 { 70 get { return this.Current; } 71 } 72 MoveNext()73 public bool MoveNext() 74 { 75 _index++; 76 return (_index >= 0) && (_index < _list.Count); 77 } 78 Reset()79 public void Reset() 80 { 81 _index = -1; 82 } 83 84 #endregion 85 } 86 87 /// <summary> 88 /// Initializes a new instance of the <see cref="SymbolList"/> class. 89 /// </summary> SymbolList()90 public SymbolList() 91 { 92 } 93 GetSymbolEnumerator()94 public ISymbolEnumerator GetSymbolEnumerator() 95 { 96 return new SymbolEnumerator(this); 97 } 98 Join(string separator)99 public string Join(string separator) 100 { 101 if (separator == null) 102 separator = ""; 103 104 StringBuilder result = new StringBuilder(); 105 106 foreach (Symbol s in this) 107 { 108 result.Append(s); 109 result.Append(separator); 110 } 111 112 if (result.Length > 0) 113 { 114 result.Length -= separator.Length; 115 } 116 117 return result.ToString(); 118 } 119 } 120 121 public static class SymbolEnumeratorExtension 122 { NextSymbol(this IEnumerator<Symbol> enumerator)123 public static Symbol NextSymbol(this IEnumerator<Symbol> enumerator) 124 { 125 if (enumerator.MoveNext()) 126 { 127 return enumerator.Current; 128 } 129 130 return null; 131 } 132 NextNonEOLSymbol(this IEnumerator<Symbol> enumerator)133 public static Symbol NextNonEOLSymbol(this IEnumerator<Symbol> enumerator) 134 { 135 while (enumerator.MoveNext()) 136 { 137 if (enumerator.Current != Symbol.EOL) 138 { 139 return enumerator.Current; 140 } 141 } 142 143 return null; 144 } 145 } 146 } 147