< Summary

Information
Class: SwiftCollections.SwiftDeterministicObjectEqualityComparer
Assembly: SwiftCollections
File(s): /home/runner/work/SwiftCollections/SwiftCollections/src/SwiftCollections/EqualityComparer/SwiftDeterministicObjectEqualityComparer.cs
Line coverage
100%
Covered lines: 12
Uncovered lines: 0
Coverable lines: 12
Total lines: 55
Line coverage: 100%
Branch coverage
100%
Covered branches: 12
Total branches: 12
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
.ctor(...)100%11100%
Equals(...)100%66100%
Equals(...)100%22100%
GetHashCode(...)100%44100%
GetHashCode()100%11100%
GetObjectData(...)100%11100%

File(s)

/home/runner/work/SwiftCollections/SwiftCollections/src/SwiftCollections/EqualityComparer/SwiftDeterministicObjectEqualityComparer.cs

#LineLine coverage
 1//=======================================================================
 2// SwiftDeterministicObjectEqualityComparer.cs
 3//=======================================================================
 4// MIT License, Copyright (c) 2024–present David Oravsky (mrdav30)
 5// See LICENSE file in the project root for full license information.
 6//=======================================================================
 7
 8using SwiftCollections.Utility;
 9using System.Collections;
 10using System.Collections.Generic;
 11using System.Runtime.CompilerServices;
 12using System.Runtime.Serialization;
 13
 14namespace SwiftCollections;
 15
 16/// <summary>
 17/// Provides a deterministic object comparer used by SwiftCollections when no comparer is supplied.
 18/// Strings are hashed via <see cref="SwiftHashTools.MurmurHash3(string, int)"/> to avoid runtime-dependent string hashe
 19/// </summary>
 20internal sealed class SwiftDeterministicObjectEqualityComparer : IEqualityComparer<object>, IEqualityComparer, ISerializ
 21{
 22    private readonly int _seed;
 23
 424    public SwiftDeterministicObjectEqualityComparer() : this(SwiftHashTools.DefaultDeterministicObjectHashSeed) { }
 25
 726    internal SwiftDeterministicObjectEqualityComparer(int seed)
 27    {
 728        _seed = seed;
 729    }
 30
 31    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 32    public new bool Equals(object? x, object? y)
 33    {
 534        return x == y || (x != null && y != null && x.Equals(y));
 35    }
 36
 37    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 338    public override bool Equals(object? obj) => obj is SwiftDeterministicObjectEqualityComparer other && _seed == other.
 39
 40    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 41    public int GetHashCode(object obj)
 42    {
 1043        if (obj == null) return 0;
 1444        if (obj is string text) return SwiftHashTools.MurmurHash3(text, _seed);
 245        return obj.GetHashCode() ^ _seed;
 46    }
 47
 48    [MethodImpl(MethodImplOptions.NoInlining)]
 249    public override int GetHashCode() => GetType().Name.GetHashCode() ^ _seed;
 50
 51    public void GetObjectData(SerializationInfo info, StreamingContext context)
 52    {
 153        info.AddValue("Seed", _seed);
 154    }
 55}