PageRenderTime 47ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/Dependencies/boo/src/Boo.Lang/Hash.cs

https://github.com/w4x/boolangstudio
C# | 114 lines | 72 code | 14 blank | 28 comment | 14 complexity | d175c814f5c19097f76d5e1026749cbc MD5 | raw file
Possible License(s): GPL-2.0
  1. #region license
  2. // Copyright (c) 2004, Rodrigo B. de Oliveira (rbo@acm.org)
  3. // All rights reserved.
  4. //
  5. // Redistribution and use in source and binary forms, with or without modification,
  6. // are permitted provided that the following conditions are met:
  7. //
  8. // * Redistributions of source code must retain the above copyright notice,
  9. // this list of conditions and the following disclaimer.
  10. // * Redistributions in binary form must reproduce the above copyright notice,
  11. // this list of conditions and the following disclaimer in the documentation
  12. // and/or other materials provided with the distribution.
  13. // * Neither the name of Rodrigo B. de Oliveira nor the names of its
  14. // contributors may be used to endorse or promote products derived from this
  15. // software without specific prior written permission.
  16. //
  17. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  18. // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  19. // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  20. // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
  21. // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22. // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  23. // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  24. // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  25. // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26. // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. #endregion
  28. using System;
  29. using System.Collections;
  30. using System.Runtime.Serialization;
  31. using Boo.Lang.Runtime;
  32. namespace Boo.Lang
  33. {
  34. /// <summary>
  35. /// Hash.
  36. /// </summary>
  37. [Serializable]
  38. [EnumeratorItemType(typeof(DictionaryEntry))]
  39. public class Hash : Hashtable
  40. {
  41. public Hash() : base(BooHashCodeProvider.Default)
  42. {
  43. }
  44. public Hash(IDictionary other) : this()
  45. {
  46. if (null == other)
  47. {
  48. throw new ArgumentNullException("other");
  49. }
  50. foreach (DictionaryEntry entry in other)
  51. {
  52. Add(entry.Key, entry.Value);
  53. }
  54. }
  55. public Hash(IEnumerable enumerable) : this()
  56. {
  57. if (null == enumerable)
  58. {
  59. throw new ArgumentNullException("enumerable");
  60. }
  61. foreach (Array tuple in enumerable)
  62. {
  63. Add(tuple.GetValue(0), tuple.GetValue(1));
  64. }
  65. }
  66. public Hash(bool caseInsensitive) : base(StringComparer.InvariantCultureIgnoreCase)
  67. {
  68. }
  69. public Hash(SerializationInfo info, StreamingContext context) : base(info, context)
  70. {
  71. }
  72. override public object Clone()
  73. {
  74. return new Hash(this);
  75. }
  76. public override bool Equals(object obj)
  77. {
  78. if (this == obj) return true;
  79. if (obj == null) return false;
  80. if (GetType() != obj.GetType()) return false;
  81. Hash other = (Hash) obj;
  82. if (Count != other.Count) return false;
  83. foreach (DictionaryEntry entry in other)
  84. {
  85. if (!ContainsKey(entry.Key)) return false;
  86. if (!RuntimeServices.EqualityOperator(entry.Value, this[entry.Key])) return false;
  87. }
  88. return true;
  89. }
  90. public override int GetHashCode()
  91. {
  92. int hashCode = 0;
  93. foreach (object item in this)
  94. {
  95. hashCode ^= GetHash(item);
  96. }
  97. return hashCode;
  98. }
  99. }
  100. }