AbstractMap.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. namespace SharpCifs.Util.Sharpen
  6. {
  7. public abstract class AbstractMap<T, TU> : IDictionary<T, TU>
  8. {
  9. public virtual void Clear()
  10. {
  11. EntrySet().Clear();
  12. }
  13. public virtual bool ContainsKey(object name)
  14. {
  15. return EntrySet().Any(p => p.Key.Equals((T)name));
  16. }
  17. public abstract ICollection<KeyValuePair<T, TU>> EntrySet();
  18. public virtual TU Get(object key)
  19. {
  20. return EntrySet().Where(p => p.Key.Equals(key)).Select(p => p.Value).FirstOrDefault();
  21. }
  22. protected virtual IEnumerator<KeyValuePair<T, TU>> InternalGetEnumerator()
  23. {
  24. return EntrySet().GetEnumerator();
  25. }
  26. public virtual bool IsEmpty()
  27. {
  28. return !EntrySet().Any();
  29. }
  30. public virtual TU Put(T key, TU value)
  31. {
  32. throw new NotSupportedException();
  33. }
  34. public virtual TU Remove(object key)
  35. {
  36. Iterator<TU> iterator = EntrySet() as Iterator<TU>;
  37. if (iterator == null)
  38. {
  39. throw new NotSupportedException();
  40. }
  41. while (iterator.HasNext())
  42. {
  43. TU local = iterator.Next();
  44. if (local.Equals((T)key))
  45. {
  46. iterator.Remove();
  47. return local;
  48. }
  49. }
  50. return default(TU);
  51. }
  52. void ICollection<KeyValuePair<T, TU>>.Add(KeyValuePair<T, TU> item)
  53. {
  54. Put(item.Key, item.Value);
  55. }
  56. bool ICollection<KeyValuePair<T, TU>>.Contains(KeyValuePair<T, TU> item)
  57. {
  58. throw new NotImplementedException();
  59. }
  60. void ICollection<KeyValuePair<T, TU>>.CopyTo(KeyValuePair<T, TU>[] array, int arrayIndex)
  61. {
  62. EntrySet().CopyTo(array, arrayIndex);
  63. }
  64. bool ICollection<KeyValuePair<T, TU>>.Remove(KeyValuePair<T, TU> item)
  65. {
  66. Remove(item.Key);
  67. return true;
  68. }
  69. void IDictionary<T, TU>.Add(T key, TU value)
  70. {
  71. Put(key, value);
  72. }
  73. bool IDictionary<T, TU>.ContainsKey(T key)
  74. {
  75. return ContainsKey(key);
  76. }
  77. bool IDictionary<T, TU>.Remove(T key)
  78. {
  79. if (ContainsKey(key))
  80. {
  81. Remove(key);
  82. return true;
  83. }
  84. return false;
  85. }
  86. bool IDictionary<T, TU>.TryGetValue(T key, out TU value)
  87. {
  88. if (ContainsKey(key))
  89. {
  90. value = Get(key);
  91. return true;
  92. }
  93. value = default(TU);
  94. return false;
  95. }
  96. IEnumerator<KeyValuePair<T, TU>> IEnumerable<KeyValuePair<T, TU>>.GetEnumerator()
  97. {
  98. return InternalGetEnumerator();
  99. }
  100. IEnumerator IEnumerable.GetEnumerator()
  101. {
  102. return InternalGetEnumerator();
  103. }
  104. public virtual int Count
  105. {
  106. get { return EntrySet().Count; }
  107. }
  108. public TU this[T key]
  109. {
  110. get { return Get(key); }
  111. set { Put(key, value); }
  112. }
  113. public virtual IEnumerable<T> Keys
  114. {
  115. get { return EntrySet().Select(p => p.Key); }
  116. }
  117. int ICollection<KeyValuePair<T, TU>>.Count
  118. {
  119. get { return Count; }
  120. }
  121. bool ICollection<KeyValuePair<T, TU>>.IsReadOnly
  122. {
  123. get { return false; }
  124. }
  125. ICollection<T> IDictionary<T, TU>.Keys
  126. {
  127. get { return Keys.ToList(); }
  128. }
  129. ICollection<TU> IDictionary<T, TU>.Values
  130. {
  131. get { return Values.ToList(); }
  132. }
  133. public virtual IEnumerable<TU> Values
  134. {
  135. get { return EntrySet().Select(p => p.Value); }
  136. }
  137. }
  138. }