public Int64 Add([NotNull] T item) { if (item is null) { throw new ArgumentNullException(nameof(item)); } return(Internal.AddOrUpdate(item, 1, Increment)); }
public Boolean TryAdd([NotNull] T item, out Int64 count) { if (item is null) { throw new ArgumentNullException(nameof(item)); } try { count = Internal.AddOrUpdate(item, 1, Increment); return(true); } catch (OverflowException) { count = default; return(false); } }
public Boolean Remove([NotNull] T item, out Int64 count) { if (item is null) { throw new ArgumentNullException(nameof(item)); } lock (Internal) { if (!Internal.TryGetValue(item, out count)) { return(false); } if (count <= 1) { return(Internal.TryRemove(item, out count)); } count = Internal.AddOrUpdate(item, 0, Decrement); return(count > 0); } }