< Summary

Information
Class: SwiftCollections.SwiftDeterministicStringEqualityComparer
Assembly: SwiftCollections
File(s): /home/runner/work/SwiftCollections/SwiftCollections/src/SwiftCollections/EqualityComparer/SwiftDeterministicStringEqualityComparer.cs
Line coverage
100%
Covered lines: 15
Uncovered lines: 0
Coverable lines: 15
Total lines: 64
Line coverage: 100%
Branch coverage
100%
Covered branches: 24
Total branches: 24
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%1010100%
Equals(...)100%22100%
GetHashCode(...)100%22100%
GetHashCode(...)100%44100%
GetHashCode()100%11100%
GetObjectData(...)100%11100%

File(s)

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

#LineLine coverage
 1//=======================================================================
 2// SwiftDeterministicStringEqualityComparer.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 string comparer used by SwiftCollections when no comparer is supplied.
 18/// </summary>
 19internal sealed class SwiftDeterministicStringEqualityComparer : IEqualityComparer<string>, IEqualityComparer, ISerializ
 20{
 21    private readonly int _seed;
 22
 423    public SwiftDeterministicStringEqualityComparer() : this(SwiftHashTools.DefaultDeterministicStringHashSeed) { }
 24
 725    internal SwiftDeterministicStringEqualityComparer(int seed)
 26    {
 727        _seed = seed;
 728    }
 29
 30    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 5408631    public bool Equals(string? x, string? y) => x == y || (x != null && y != null && x.Equals(y));
 32
 33    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 34    public new bool Equals(object? x, object? y)
 35    {
 836        return x == y || (x != null && y != null && (x is string a && y is string b ? a.Equals(b) : x.Equals(y)));
 37    }
 38
 39    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 340    public override bool Equals(object? obj) => obj is SwiftDeterministicStringEqualityComparer other && _seed == other.
 41
 42    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 43    public int GetHashCode(string obj)
 44    {
 21199045        if (obj == null) return 0;
 21198846        return SwiftHashTools.MurmurHash3(obj, _seed);
 47    }
 48
 49    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 50    public int GetHashCode(object obj)
 51    {
 552        if (obj == null) return 0;
 453        if (obj is string text) return SwiftHashTools.MurmurHash3(text, _seed);
 254        return obj.GetHashCode() ^ _seed;
 55    }
 56
 57    [MethodImpl(MethodImplOptions.NoInlining)]
 258    public override int GetHashCode() => GetType().Name.GetHashCode() ^ _seed;
 59
 60    public void GetObjectData(SerializationInfo info, StreamingContext context)
 61    {
 162        info.AddValue("Seed", _seed);
 163    }
 64}