/// <summary> /// </summary> /// <param name="indexCoverage"></param> public IndexedEdgeSet(IndexCoverage indexCoverage = IndexCoverage.Basic) { this.IndexCoverage = indexCoverage; _indexes = Enum.GetValues(typeof(IndexCoverage)) .OfType <IndexCoverage>() .Where(c => this.IndexCoverage.HasFlag(c) && c.HasSingleFlag()); }
// Selects the best index in the supplied IndexCoverage for the given set. // Returns a tuple<index, remaining bitfield> /// <summary> /// /// </summary> /// <param name="coverage"></param> /// <param name="mask"></param> /// <returns></returns> public static Tuple <IndexCoverage, TripleMask> SelectIndex(this IndexCoverage coverage, TripleMask mask) { if (mask == TripleMask.None) { return(Tuple.Create(IndexCoverage.None, TripleMask.None)); } // The prefered order of indices. byte[] pref = { 10, 13, 12, 11, 5, 4, 7, 6, 8, 9, 0, 2, 1, 3 }; // The bitmask for each index. byte[] table = { 1, 2, 4, 8, 3, 5, 9, 6, 10, 12, 7, 11, 13, 14 }; int i; for (i = 0; i < 14; i++) { if (((int)mask & table[pref[i]]) == table[pref[i]] && coverage.HasFlag((IndexCoverage)(1 << pref[i]))) { break; } } return(Tuple.Create((IndexCoverage)(1 << pref[i]), (TripleMask)((int)mask & ~table[pref[i]]))); }
/// <summary> /// /// </summary> /// <param name="ic"></param> /// <returns></returns> public static TripleMask ToMask(this IndexCoverage ic) { Debug.Assert((ic & (ic - 1)) == 0, "Only one flag can be set."); byte[] table = { 1, 2, 4, 8, 3, 5, 9, 6, 10, 12, 7, 11, 13, 14 }; return((TripleMask)table[(int)Math.Log((int)ic, 2)]); }
/// <summary> /// /// </summary> /// <param name="coverage"></param> /// <param name="s"></param> /// <param name="p"></param> /// <param name="o"></param> /// <param name="c"></param> /// <returns></returns> public static Tuple <IndexCoverage, TripleMask> SelectIndex(this IndexCoverage coverage, INode s, INode p, INode o, INode c) { var requested = TripleMask.None; if (s != null) { requested |= TripleMask.Subject; } if (p != null) { requested |= TripleMask.Predicate; } if (o != null) { requested |= TripleMask.Object; } if (c != null) { requested |= TripleMask.Context; } return(coverage.SelectIndex(requested)); }
/// <summary> /// /// </summary> /// <param name="coverage"></param> /// <returns></returns> public static bool HasSingleFlag(this IndexCoverage coverage) { var x = (int)coverage; return((x != 0) && ((x & (x - 1)) == 0)); }
/// <summary> /// /// </summary> /// <param name="coverage"></param> /// <param name="triple"></param> /// <returns></returns> public static Tuple <IndexCoverage, TripleMask> SelectIndex(this IndexCoverage coverage, Edge triple) => coverage.SelectIndex(triple.Subject, triple.Predicate, triple.Object, triple.Context);