using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; using miew.Debugging; using miew.Enumerable; using miew.String; namespace agree { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public unsafe partial class TypeMgr { public Edge CreateEdge(Type t, int m, bool f_coref) { Debug.Assert(t != null && t.tm == this); Edge.Flag f; if (t == StringType) f = Edge.Flag.EtmString; else { f = (Edge.Flag)t.m_id; if ((t.m_flags & Type.Flags.HasAnyFeatures) > 0) f |= Edge.Flag.EtmNonBareType; } if (f_coref) f |= Edge.Flag.Coreference; /// Caller may not submit a non-bare mark if the requirements for a non-bare mark are not met /// Caller must submit the mark to recycle. Otherwise, use the Tfs functions. if (((f & (Edge.Flag.Coreference | Edge.Flag.EtmNonBareType)) == 0) != (m == 0)) throw new Exception(); return new Edge(f, m); } public Type GetEdgeType(Edge.Flag f) { if ((f & Edge.Flag.EtmMask) == Edge.Flag.EtmString) return StringType; int mid = (int)(f & Edge.Flag.MultiIdMask); return mid == 0 ? TopType : type_arr[mid]; } public bool IsTopId(Edge e) { return (int)(e.FlagsId & (Edge.Flag.MultiIdMask | Edge.Flag.EtmMask)) == 0; } public bool IsStringValue(Edge.Flag f) { return (f & Edge.Flag.EtmMask) == Edge.Flag.EtmString && (f & Edge.Flag.MultiIdMask) != 0; } public String GetStringValue(Edge.Flag f) { int sid; if ((f & Edge.Flag.EtmMask) != Edge.Flag.EtmString || (sid = (int)(f & Edge.Flag.MultiIdMask)) == 0) return null; return strings.Get(sid); } }; }