using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using miew.Debugging;
namespace agree
{
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public partial class BootstrapTfs : MarkingTfs
{
public BootstrapTfs(TypeMgr tm, int c_edge_hint)
: base(tm)
{
this.d = new Dictionary<UInt64, Edge>(c_edge_hint | 1);
}
public BootstrapTfs(TypeMgr tm, Type t, bool f_coref)
: base(tm, t, f_coref)
{
this.d = new Dictionary<UInt64, Edge>(277);
}
public Dictionary<UInt64, Edge> d;
public override Tfs Clone() { throw new NotImplementedException(); }
public override int EdgeCount { get { return d.Count; } }
public override void SetEdge(int i_feat, int mark, Edge e)
{
Debug.Assert(mark != 0);
Debug.Assert(!e.Equals(default(Edge)));
d[((ulong)i_feat << 32) | (uint)mark] = e;
}
public override bool TryGetEdge(int i_feat, int mark, out Edge e)
{
Debug.Assert(mark != 0);
return d.TryGetValue(((ulong)i_feat << 32) | (uint)mark, out e);
}
public override Edge.Flag TryGetFlagsMark(int i_feat, int mark, out int m)
{
Edge e;
d.TryGetValue(((ulong)i_feat << 32) | (uint)mark, out e);
m = e.Mark;
return e.FlagsId;
}
public unsafe override ulong GetUlEdge(FeatMark fm)
{
Edge e;
d.TryGetValue(((ulong)fm.i_feat << 32) | (uint)fm.m, out e);
return *(ulong*)&e;
}
public override Edge GetEdge(int i_feat, int mark)
{
Debug.Assert(mark != 0);
Edge e;
d.TryGetValue(((ulong)i_feat << 32) | (uint)mark, out e);
return e;
}
public override bool RemoveEdge(int i_feat, int mark)
{
Debug.Assert(mark != 0);
return d.Remove(((ulong)i_feat << 32) | (uint)mark);
}
public override void AddEdge(int i_feat, int mark, Edge e)
{
Debug.Assert(mark != 0);
d.Add(((ulong)i_feat << 32) | (uint)mark, e);
}
public override IEnumerable<FeatMarkEdge> FeatMarkEdges
{
get
{
foreach (var kvp in d)
{
ulong ul = kvp.Key;
yield return new FeatMarkEdge(new FeatMark((int)(ul >> 32), (int)ul), kvp.Value);
}
}
}
public override bool ContainsFeatMark(int i_feat, int mark)
{
return d.ContainsKey(((ulong)i_feat << 32) | (uint)mark);
}
public override bool _ContainsInMark(int mark)
{
return d.Keys.Any(m => mark == (int)m);
}
};
}