Exemplo n.º 1
0
 /// <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());
 }
Exemplo n.º 2
0
        // 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]])));
        }
Exemplo n.º 3
0
        /// <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)]);
        }
Exemplo n.º 4
0
        /// <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));
        }
Exemplo n.º 5
0
        /// <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));
        }
Exemplo n.º 6
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);