serde-generate/runtime/csharp/Serde/ValueDictionary.cs (53 lines of code) (raw):

// Copyright (c) Facebook, Inc. and its affiliates // SPDX-License-Identifier: MIT OR Apache-2.0 using System; using System.Collections; using System.Collections.Generic; namespace Serde { /// <summary> /// Immutable wrapper class around <see cref="Dictionary<K, V>"/>. Implements value semantics for /// <see cref="object.Equals(object)"/> and <see cref="object.GetHashCode"/>. /// </summary> public class ValueDictionary<K, V> : IEquatable<ValueDictionary<K, V>>, IReadOnlyDictionary<K, V> where K: IEquatable<K> where V: IEquatable<V> { private readonly Dictionary<K, V> dict; private int? hashCode; public int Count => dict.Count; public IEnumerable<K> Keys => dict.Keys; public IEnumerable<V> Values => dict.Values; public V this[K key] => dict[key]; public ValueDictionary(Dictionary<K, V> dictionary) { dict = dictionary ?? throw new ArgumentNullException(nameof(dictionary)); hashCode = null; } public bool ContainsKey(K key) => dict.ContainsKey(key); public bool TryGetValue(K key, out V value) => dict.TryGetValue(key, out value); IEnumerator<KeyValuePair<K, V>> IEnumerable<KeyValuePair<K, V>>.GetEnumerator() => dict.GetEnumerator(); public IEnumerator GetEnumerator() => ((IEnumerable)dict).GetEnumerator(); public override bool Equals(object obj) => obj is ValueDictionary<K, V> bytes && Equals(bytes); public bool Equals(ValueDictionary<K, V> other) { if (other == null) return false; if (Count != other.Count) return false; foreach (var key in Keys) { if (!other.ContainsKey(key)) return false; if (!dict[key].Equals(other[key])) return false; } return true; } public static bool operator ==(ValueDictionary<K, V> left, ValueDictionary<K, V> right) => Equals(left, right); public static bool operator !=(ValueDictionary<K, V> left, ValueDictionary<K, V> right) => !Equals(left, right); public override int GetHashCode() { unchecked { if (hashCode.HasValue) return hashCode.Value; int code = 45053; foreach (var pair in dict) { code = code * 31 + pair.Key.GetHashCode(); code = code * 31 + pair.Value.GetHashCode(); } hashCode = code; return code; } } } }