rd-net/RdFramework/Text/Intrinsics/TextBufferVersion.cs (77 lines of code) (raw):

using System.Collections.Generic; namespace JetBrains.Rd.Text.Intrinsics { public struct TextBufferVersion { public static TextBufferVersion InitVersion = new TextBufferVersion(-1, -1); public TextBufferVersion(int master, int slave) : this() { Master = master; Slave = slave; } public int Master { get; } public int Slave { get; } #region Overrides public bool Equals(TextBufferVersion other) { return Master == other.Master && Slave == other.Slave; } public static bool operator ==(TextBufferVersion left, TextBufferVersion right) { return left.Equals(right); } public static bool operator !=(TextBufferVersion left, TextBufferVersion right) { return !left.Equals(right); } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) return false; return obj is TextBufferVersion && Equals((TextBufferVersion) obj); } public override int GetHashCode() { unchecked { return (Master*397) ^ Slave; } } #endregion #region Comparer private static readonly IEqualityComparer<TextBufferVersion> ourMasterVersionSlaveVersionComparerInstance = new MasterVersionSlaveVersionEqualityComparer(); public static IEqualityComparer<TextBufferVersion> MasterVersionSlaveVersionComparer { get { return ourMasterVersionSlaveVersionComparerInstance; } } private sealed class MasterVersionSlaveVersionEqualityComparer : IEqualityComparer<TextBufferVersion> { public bool Equals(TextBufferVersion x, TextBufferVersion y) { return x.Master == y.Master && x.Slave == y.Slave; } public int GetHashCode(TextBufferVersion obj) { unchecked { return (obj.Master*397) ^ obj.Slave; } } } #endregion #region Utils public TextBufferVersion IncrementMaster() { return new TextBufferVersion(Master + 1, Slave); } public TextBufferVersion IncrementSlave() { return new TextBufferVersion(Master, Slave + 1); } #endregion public override string ToString() { return $"TextBufferVersion(master={Master}, slave={Slave})"; } } }