using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using glue.Debugging;
namespace agree
{
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sealed public class SingleUserTray : Tray
{
public SingleUserTray(int tix, TypeMgr tm, int next_mark, int next_id)
: base(tix, tm, next_mark, next_id)
{
for (int i = 0; i < Pools.Length; i++)
Pools[i] = new SingleUserTrayConstraintPool(this, i);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sealed public class SingleUserTrayConstraintPool : ConstraintPool
{
public SingleUserTrayConstraintPool(Tray tr, int i_feat)
: base(tr, i_feat)
{
}
Dictionary<Int32, Edge> dict = new Dictionary<Int32, Edge>();
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public override Edge GetEdge(Int32 m)
{
Debug.Assert(m != 0);
Edge c;
dict.TryGetValue(m, out c);
return c;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public override bool TryGetEdge(int m, out Edge e)
{
Debug.Assert(m != 0);
return dict.TryGetValue(m, out e);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Store the constraint for the specified mark. Handle Edge value semantics properly.
/// Allows detached mark to be set for bare or atomic types
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public override void SetEdge(Int32 m, Edge c)
{
Debug.Assert(m != 0 && m >= tr._protect_mark && c.FlagsId != 0);
dict[m] = c;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public override void RemoveEdge(Int32 m)
{
Debug.Assert(m != 0 && m >= tr._protect_mark);
dict.Remove(m);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public override bool TryRemoveEdge(Int32 m, out Edge e)
{
Debug.Assert(m != 0 && m >= tr._protect_mark);
return dict.TryGetValue(m, out e) ? dict.Remove(m) : false;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public override bool ContainsInMark(Int32 m)
{
Debug.Assert(m != 0);
return dict.ContainsKey(m);
}
public override int Count { get { return dict.Count; } }
public override IEnumerable<int> Marks { get { return dict.Keys; } }
public override IEnumerable<Edge> Edges { get { return dict.Values; } }
public override IEnumerable<KeyValuePair<int, Edge>> PoolEdges { get { return dict; } }
};
};
}