using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using miew.Debugging; namespace agree { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public partial struct FeatMark : IEquatable<FeatMark>, IComparable<FeatMark> { public static readonly HashSet<FeatMark> EmptyHashSet = new HashSet<FeatMark>(); public FeatMark(int i_feat, int m) { this.i_feat = i_feat; this.m = m; } public unsafe FeatMark(ulong ul) { this = *(FeatMark*)&ul; } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public int i_feat; [DebuggerBrowsable(DebuggerBrowsableState.Never)] public int m; public bool Equals(FeatMark other) { return m == other.m && i_feat == other.i_feat; } public override int GetHashCode() { return m ^ i_feat; } public int CompareTo(FeatMark other) { int d = m - other.m; return d != 0 ? d : i_feat - other.i_feat; } public Edge Constraint(Tfs tfs) { return tfs.GetEdge(i_feat, m); } public static unsafe explicit operator ulong(FeatMark fm) { return *(ulong *)&fm; } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [DebuggerDisplay("{ToString(),nq}")] public struct FeatMarkEdge : IComparable<FeatMarkEdge>, IEquatable<FeatMarkEdge> { public FeatMarkEdge(FeatMark fm, Edge e) { this.i_feat = fm.i_feat; this.mark = fm.m; this.e = e; } public FeatMarkEdge(int i_feat, int mark, Edge e) { this.i_feat = i_feat; this.mark = mark; this.e = e; } public FeatMarkEdge(ulong ul, Edge e) { this.i_feat = (int)(ul >> 32); this.mark = (int)ul; this.e = e; } public FeatMarkEdge(int i_feat, int mark) { this.i_feat = i_feat; this.mark = mark; this.e = default(Edge); } public int i_feat; public int mark; public Edge e; public FeatMark FeatMark { get { return new FeatMark(i_feat, mark); } } public int CompareTo(FeatMarkEdge other) { int d = mark - other.mark; return d != 0 ? d : i_feat - other.i_feat; } #if DEBUG public override string ToString() { Grammar g = Grammar._singleton; TypeMgr tm; FeatureInfo[] rgfi; String f; if (g == null || (tm = g.tm) == null || (rgfi = tm.feat_arr) == null || i_feat >= rgfi.Length || (f = rgfi[i_feat].feature) == null) return String.Format("{0} {1} {2}", i_feat, mark, e.ToString()); String s = mark + "/" + rgfi[i_feat].feature.ToUpper(); return String.Format("{0,20} {1}", s, e); } #endif public bool Equals(FeatMarkEdge other) { return this.mark == other.mark && this.i_feat == other.i_feat && this.e.Mark == other.e.Mark && this.e.FlagsId == other.e.FlagsId; } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [DebuggerDisplay("{ToString(),nq}")] public struct TfsFeatMark : IEquatable<TfsFeatMark> { public static readonly HashSet<TfsFeatMark> EmptyHashSet = new HashSet<TfsFeatMark>(); public TfsFeatMark(Tfs tfs, int i_feat, int m) { this.tfs = tfs; this.i_feat = i_feat; this.m = m; } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public Tfs tfs; [DebuggerBrowsable(DebuggerBrowsableState.Never)] public int i_feat; [DebuggerBrowsable(DebuggerBrowsableState.Never)] public int m; public bool Equals(TfsFeatMark other) { return m == other.m && i_feat == other.i_feat && tfs == other.tfs; } public override int GetHashCode() { return m ^ i_feat ^ tfs.id; } public Edge Constraint { get { return tfs.GetEdge(i_feat, m); } } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [DebuggerDisplay("{ToString(),nq}")] public struct TfsEdge : IEquatable<TfsEdge>, IComparable<TfsEdge> { public TfsEdge(Tfs tfs, Edge e) { this.tfs = tfs; this.e = e; } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public Tfs tfs; [DebuggerBrowsable(DebuggerBrowsableState.Never)] public Edge e; public bool Equals(TfsEdge other) { return e.Mark == other.e.Mark && e.FlagsId == other.e.FlagsId && tfs == other.tfs; } public override int GetHashCode() { return e.Mark ^ (int)e.FlagsId ^ tfs.id; } [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] public ConstraintRef[] _BELOW { get { if ((e.FlagsId & Edge.Flag.EtmNonBareType) == 0) return ConstraintRef.NoneBelow; return tfs.AllConstraintRefs(e).ToArray(); } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public bool IsTarget { get { return tfs is TargetTfs || (tfs is TfsSection && ((TfsSection)tfs).mother.IsTarget); } } public override string ToString() { if (tfs == null) return "(null tfs) " + e.ToString(); return String.Format("{0} {1}", tfs.id.ToString("X"), e); } public int CompareTo(TfsEdge other) { int d = this.tfs.id - other.tfs.id; if (d == 0 && (d = this.e.Mark - other.e.Mark) == 0) d = this.e.FlagsId - other.e.FlagsId; return d; } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [DebuggerDisplay("{ToString(),nq}")] public struct TfsixEdge : IEquatable<TfsixEdge>, IComparable<TfsixEdge> { [DebuggerHidden] public TfsixEdge(short tfsix, Edge e) { this.tfsix = tfsix; this.e = e; } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public short tfsix; [DebuggerBrowsable(DebuggerBrowsableState.Never)] public Edge e; public bool Equals(TfsixEdge other) { return e.Mark == other.e.Mark && e.FlagsId == other.e.FlagsId && tfsix == other.tfsix; } public override int GetHashCode() { return e.Mark ^ (int)e.FlagsId ^ tfsix; } //[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] //public ConstraintRef[] _BELOW //{ // get // { // if ((e.FlagsId & Edge.Flag.EtmNonBareType) == 0) // return ConstraintRef.NoneBelow; // return tfs.AllConstraintRefs(e).ToArray(); // } //} //[DebuggerBrowsable(DebuggerBrowsableState.Never)] //public bool IsTarget { get { return tfs is TargetTfs || (tfs is TfsSection && ((TfsSection)tfs).mother.IsTarget); } } public override string ToString() { return String.Format("ix: {0} {1}", tfsix, e); } public int CompareTo(TfsixEdge other) { int d = this.tfsix - other.tfsix; if (d == 0 && (d = this.e.Mark - other.e.Mark) == 0) d = this.e.FlagsId - other.e.FlagsId; return d; } }; public partial struct TfsMark { static public TfsMark[] None = new TfsMark[0]; public TfsMark(Tfs tfs, int mark) { this.tfs = tfs; this.mark = mark; } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public Tfs tfs; [DebuggerBrowsable(DebuggerBrowsableState.Never)] public int mark; public override string ToString() { if (tfs == null) return "(null tfs)"; return String.Format(" {0:X}/{1} ({2})", tfs.id, mark, tfs.GetCorefEdge(mark).ToString()); } }; }