using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; using miew.Tally; namespace agree { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// Tfs interface /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public interface ITfs { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Core access /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void SetEdge(int i_feat, int mark, Edge e); bool TryGetEdge(int i_feat, int mark, out Edge e); bool RemoveEdge(int i_feat, int mark); void AddEdge(int i_feat, int mark, Edge e); Edge GetEdge(int i_feat, int mark); IEnumerable<FeatMarkEdge> FeatMarkEdges { get; } bool ContainsFeatMark(int i_feat, int mark); int EdgeCount { get; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Coref management /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Tfs Clone(); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Debugging use /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool _ContainsInMark(int mark); }; public interface ITarget { }; public interface ITargetTfs : ITfs, ITarget { }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public abstract partial class Tfs : ISysObj { static public miew.Concurrency.FalseSharing.Padding56 p1; static public int next_tfs_id = 0; static public miew.Concurrency.FalseSharing.Padding56 p2; protected Tfs(TypeMgr tm) { this.tm = tm; //this.id = tm.config.system.MultiThreading ? Interlocked.Increment(ref next_id) : ++next_id; this.id = Interlocked.Increment(ref next_tfs_id); //this.id = this.GetHashCode(); } protected Tfs(TypeMgr tm, Edge e) : this(tm) { this.Edge = e; } [DebuggerBrowsable(DebuggerBrowsableState.Never)] readonly public TypeMgr tm; public int id; [DebuggerBrowsable(DebuggerBrowsableState.Never)] public int DisplayId { get { return id; } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public Edge Edge; public String Name; public byte[] coref_tally_map; public byte[] coref_tally_map_restricted; public int next_mark = 1; public int next_coref_mark = -1; public static readonly byte[] NoCorefsTallyMap = new byte[0]; public abstract void SetEdge(int i_feat, int mark, Edge e); public abstract bool TryGetEdge(int i_feat, int mark, out Edge e); public abstract Edge.Flag TryGetFlagsMark(int i_feat, int mark, out int m); public abstract ulong GetUlEdge(FeatMark fm); public abstract bool RemoveEdge(int i_feat, int mark); public abstract void AddEdge(int i_feat, int mark, Edge e); public abstract Edge GetEdge(int i_feat, int mark); [DebuggerBrowsable(DebuggerBrowsableState.Never)] public abstract IEnumerable<FeatMarkEdge> FeatMarkEdges { get; } public abstract bool ContainsFeatMark(int i_feat, int mark); public abstract int EdgeCount { get; } public virtual int ScratchAlloc { get { return EdgeCount; } } public abstract bool _ContainsInMark(int mark); public virtual bool IsRestricted { get { return false; } } /// <summary> /// Cloning a TFS allows it to be used multiple times within the same unification operation (including within the /// same TFS) while having its coreferences maintained as distinct. /// </summary> public abstract Tfs Clone(); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public Type Type { get { return (Edge.FlagsId & Edge.Flag.EtmMask) == agree.Edge.Flag.EtmString ? tm.StringType : tm.type_arr[(int)(Edge.FlagsId & Edge.Flag.MultiIdMask)]; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public TfsSection GetSection(Edge e, int ix) { //Debug.Assert(this._ContainsInMark(e.Mark)); return new TfsSection(this, e, ix); } public TfsSection GetSection(PathEdge pe, int ix) { //Debug.Assert(this._ContainsInMark(e.Mark)); return new TfsSection(this, pe, ix); } public TfsSection GetSection(FsPath p) { Edge e = Edge; foreach (String f in p) { if (e.Mark == 0) return null; int i_feat = tm.GetFeatureIndex(f); if (i_feat == -1 || !TryGetEdge(i_feat, e.Mark, out e)) return null; } return new TfsSection(this, e, 0); } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public TfsEdge TfsEdge { get { return new TfsEdge(this, Edge); } } public TfsEdge GetSectionTfsEdge(Edge e) { return new TfsEdge(this, e); } //public Edge GetEdge(int mark) //{ // foreach (var fme in FeatMarkEdges) // if (fme.mark == mark) // return fme.e; // return default(Edge); //} public Edge GetCorefEdge(int out_mark) { if (out_mark == Edge.Mark) return Edge; foreach (var fme in FeatMarkEdges) if (fme.e.Mark == out_mark) return fme.e; return default(Edge); } public FeatMark GetHostFeatMark(int out_mark) { Debug.Assert(out_mark > 0); /// if coreferenced, there are multiple possible results if (out_mark != Edge.Mark) foreach (var fme in FeatMarkEdges) if (fme.e.Mark == out_mark) return fme.FeatMark; return default(FeatMark); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// ISysObj.SysObjName /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [DebuggerBrowsable(DebuggerBrowsableState.Never)] public string SysObjName { get { return ToString(); } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// ISysObj.SysObjDescription /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [DebuggerBrowsable(DebuggerBrowsableState.Never)] public string SysObjDescription { get { return ToString(); } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// ISysObj.SysObjChildren /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [DebuggerBrowsable(DebuggerBrowsableState.Never)] public miew.ReadOnly.IReadOnlyDictionary<string, ISysObj> SysObjChildren { get { return SysObjHelper<ISysObj>.Empty; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// ISysObj.SysObjParent /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [DebuggerBrowsable(DebuggerBrowsableState.Never)] public ISysObj SysObjParent { get { return tm.g; } } public bool IsTarget { get { return this is TargetTfs || (this is TfsSection && ((TfsSection)this).mother.IsTarget); } } static readonly Char[] tc = { '…', ' ', '⊣' }; public override string ToString() { return String.Format("#{0}:{1}", id.ToString("X"), Edge.ToString(tm).TrimEnd(tc).Replace(' ', '/')); } public string ToString(bool f_type) { return f_type ? ToString() : String.Format("#{0}:@{1}", id.ToString("X"), Edge.Mark); } }; }