//----------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. // //----------------------------------------------------------------------- namespace Microsoft.Isam.Esent.Interop { using System; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Runtime.InteropServices; /// /// Describes an offset in the log sequence. /// [SuppressMessage( "Microsoft.StyleCop.CSharp.NamingRules", "SA1300:ElementMustBeginWithUpperCaseLetter", Justification = "This should match the name of the unmanaged structure.")] [StructLayout(LayoutKind.Sequential)] [Serializable] public struct JET_LGPOS : IEquatable, IComparable, INullableJetStruct { /// /// Byte offset inside the sector. /// private ushort offset; /// /// Sector number. /// private ushort sector; /// /// Generation number. /// private int generation; /// /// Gets or sets the byte offset represented by this log position. This /// offset is inside of the sector. /// public int ib { [DebuggerStepThrough] get { return this.offset; } set { this.offset = checked((ushort)value); } } /// /// Gets or sets the sector number represented by this log position. /// public int isec { [DebuggerStepThrough] get { return this.sector; } set { this.sector = checked((ushort)value); } } /// /// Gets or sets the generation of this log position. /// public int lGeneration { [DebuggerStepThrough] get { return this.generation; } set { this.generation = value; } } /// /// Gets a value indicating whether this log position is null. /// public bool HasValue { get { return 0 != this.lGeneration; } } /// /// Determines whether two specified instances of JET_LGPOS /// are equal. /// /// The first instance to compare. /// The second instance to compare. /// True if the two instances are equal. public static bool operator ==(JET_LGPOS lhs, JET_LGPOS rhs) { return lhs.Equals(rhs); } /// /// Determines whether two specified instances of JET_LGPOS /// are not equal. /// /// The first instance to compare. /// The second instance to compare. /// True if the two instances are not equal. public static bool operator !=(JET_LGPOS lhs, JET_LGPOS rhs) { return !(lhs == rhs); } /// /// Determine whether one log position is before another log position. /// /// The first log position to compare. /// The second log position to compare. /// True if lhs comes before rhs. public static bool operator <(JET_LGPOS lhs, JET_LGPOS rhs) { return lhs.CompareTo(rhs) < 0; } /// /// Determine whether one log position is after another log position. /// /// The first log position to compare. /// The second log position to compare. /// True if lhs comes after rhs. public static bool operator >(JET_LGPOS lhs, JET_LGPOS rhs) { return lhs.CompareTo(rhs) > 0; } /// /// Determine whether one log position is before or equal to /// another log position. /// /// The first log position to compare. /// The second log position to compare. /// True if lhs comes before or is equal to rhs. public static bool operator <=(JET_LGPOS lhs, JET_LGPOS rhs) { return lhs.CompareTo(rhs) <= 0; } /// /// Determine whether one log position is after or equal to /// another log position. /// /// The first log position to compare. /// The second log position to compare. /// True if lhs comes after or is equal to rhs. public static bool operator >=(JET_LGPOS lhs, JET_LGPOS rhs) { return lhs.CompareTo(rhs) >= 0; } /// /// Generate a string representation of the structure. /// /// The structure as a string. public override string ToString() { return string.Format( CultureInfo.InvariantCulture, "JET_LGPOS(0x{0:X},{1:X},{2:X})", this.lGeneration, this.isec, this.ib); } /// /// Returns a value indicating whether this instance is equal /// to another instance. /// /// An object to compare with this instance. /// True if the two instances are equal. public override bool Equals(object obj) { if (obj == null || this.GetType() != obj.GetType()) { return false; } return this.Equals((JET_LGPOS)obj); } /// /// Returns the hash code for this instance. /// /// The hash code for this instance. public override int GetHashCode() { return this.generation ^ (this.sector << 16) ^ this.offset; } /// /// Returns a value indicating whether this instance is equal /// to another instance. /// /// An instance to compare with this instance. /// True if the two instances are equal. public bool Equals(JET_LGPOS other) { return this.generation == other.generation && this.sector == other.sector && this.offset == other.offset; } /// /// Compares this log position to another log position and determines /// whether this instance is before, the same as or after the other /// instance. /// /// The log position to compare to the current instance. /// /// A signed number indicating the relative positions of this instance and the value parameter. /// public int CompareTo(JET_LGPOS other) { int compare = this.generation.CompareTo(other.generation); if (0 == compare) { compare = this.sector.CompareTo(other.sector); } if (0 == compare) { compare = this.offset.CompareTo(other.offset); } return compare; } } }