Skip to content

Commit

Permalink
Comparers (discord-net#929)
Browse files Browse the repository at this point in the history
* Add entity equality comparers

* Fix namespace #whoops

* Add Message comparer.

* Add comment explaining the specialized implementation

* Remove specialized implementation, as per feedback
  • Loading branch information
Joe4evr authored and FiniteReality committed May 5, 2018
1 parent d60da95 commit a255215
Showing 1 changed file with 45 additions and 0 deletions.
45 changes: 45 additions & 0 deletions src/Discord.Net.Core/Utils/Comparers.cs
@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;

namespace Discord
{
public static class DiscordComparers
{
// TODO: simplify with '??=' slated for C# 8.0
public static IEqualityComparer<IUser> UserComparer => _userComparer ?? (_userComparer = new EntityEqualityComparer<IUser, ulong>());
public static IEqualityComparer<IGuild> GuildComparer => _guildComparer ?? (_guildComparer = new EntityEqualityComparer<IGuild, ulong>());
public static IEqualityComparer<IChannel> ChannelComparer => _channelComparer ?? (_channelComparer = new EntityEqualityComparer<IChannel, ulong>());
public static IEqualityComparer<IRole> RoleComparer => _roleComparer ?? (_roleComparer = new EntityEqualityComparer<IRole, ulong>());
public static IEqualityComparer<IMessage> MessageComparer => _messageComparer ?? (_messageComparer = new EntityEqualityComparer<IMessage, ulong>());

private static IEqualityComparer<IUser> _userComparer;
private static IEqualityComparer<IGuild> _guildComparer;
private static IEqualityComparer<IChannel> _channelComparer;
private static IEqualityComparer<IRole> _roleComparer;
private static IEqualityComparer<IMessage> _messageComparer;

private sealed class EntityEqualityComparer<TEntity, TId> : EqualityComparer<TEntity>
where TEntity : IEntity<TId>
where TId : IEquatable<TId>
{
public override bool Equals(TEntity x, TEntity y)
{
bool xNull = x == null;
bool yNull = y == null;

if (xNull && yNull)
return true;

if (xNull ^ yNull)
return false;

return x.Id.Equals(y.Id);
}

public override int GetHashCode(TEntity obj)
{
return obj?.Id.GetHashCode() ?? 0;
}
}
}
}

0 comments on commit a255215

Please sign in to comment.