using System;
using System.Collections.Generic;
using System.Diagnostics;
using glue.Debugging;
namespace agree
{
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Lightweight, immutable encapsulation of a reference to a constraint (Edge) in the persistent store (ConstraintPool).
/// This is used by unification for keeping a list the edges that need to be patched over as successive coreferences are
/// discovered.
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public partial struct PoolMark : IEquatable<PoolMark>, IComparable<PoolMark>
{
public static readonly HashSet<PoolMark> EmptyPoolMarkHashSet = new HashSet<PoolMark>();
public PoolMark(ConstraintPool cp, Int32 in_mark)
{
this.Pool = cp;
this.in_mark = in_mark;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// The constraint pool in which the target constraint resides
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
readonly public ConstraintPool Pool;
[DebuggerDisplay("{Feature.ToUpper(),nq}")]
public String Feature { get { return Pool.Feature; } }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// The mark to use in the specified constraint pool
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
readonly public Int32 in_mark;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// The target constraint
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public Edge Constraint
{
get { return Pool.GetEdge(in_mark); }
}
public void SetConstraint(Edge e)
{
Pool.SetEdge(in_mark, e);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void RemoveConstraint()
{
Pool.RemoveEdge(in_mark);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Type of the target constraint
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
public Type ConstraintType
{
get
{
Edge e;
TypeMgr tm = Pool.tm;
if (!Pool.TryGetEdge(in_mark, out e))
return tm.TopType;
return tm.GetEdgeType(e.FlagsId);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// PoolMarks can be compared for equality and have a stable ordering
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public bool Equals(PoolMark other)
{
return in_mark == other.in_mark && Pool == other.Pool;
}
public static bool operator ==(PoolMark x, PoolMark y) { throw new NotImplementedException(); }
public static bool operator !=(PoolMark x, PoolMark y) { throw new NotImplementedException(); }
public override bool Equals(object obj)
{
throw new NotImplementedException();
}
public override int GetHashCode() { return (in_mark << 8) | Pool.i_feat; }
public int CompareTo(PoolMark other)
{
if (this.Equals(other))
return 0;
int cm = this.in_mark - other.in_mark;
if (cm != 0)
return cm;
return this.Pool.IntroducedBy.m_id - other.Pool.IntroducedBy.m_id;
}
};
}