Ejemplo n.º 1
0
        protected int FindSplit(DCompare compare)
        {
            int             x      = Root;
            int             result = 0;
            IndexFileRecord r      = new IndexFileRecord();

            while (x != 0)
            {
                GetRecord(x, ref r);
                int c = compare(ref r);
                if (c < 0)
                {
                    x = GetLeft(x);
                }
                else if (c > 0)
                {
                    result = x;
                    x      = GetRight(x);
                }
                else // c == 0
                {
                    result = x;
                    break;
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        int Compare(int x, DCompare seek)
        {
            IndexFileRecord r = new IndexFileRecord();

            GetRecord(x, ref r);
            return(seek(ref r));
        }
Ejemplo n.º 3
0
        public virtual G.IEnumerable <IndexFileRecord> From(IndexFile ixf, DCompare seek, bool desc)
        {
            IndexFileRecord v = new IndexFileRecord();

            foreach (int x in From(seek, desc))
            {
                GetRecord(x, ref v);
                yield return(v);
            }
        }
Ejemplo n.º 4
0
        public override G.IEnumerable <IndexFileRecord> From(IndexFile ixf, DCompare seek, bool desc)
        {
            int       x       = FindSplit(seek);
            long      childId = x == 0 ? FirstPage : GetChild(x);
            IndexPage cp      = ixf.GetPage(childId);

            cp.ParentId = PageId;
            foreach (IndexFileRecord r in cp.From(ixf, seek, desc))
            {
                yield return(r);
            }
        }
Ejemplo n.º 5
0
 G.IEnumerable <int> From(DCompare seek, bool desc)
 {
     if (desc)
     {
         foreach (int x in Desc(Root, seek))
         {
             yield return(x);
         }
     }
     else
     {
         foreach (int x in Asc(Root, seek))
         {
             yield return(x);
         }
     }
 }
Ejemplo n.º 6
0
        G.IEnumerable <int> Desc(int x, DCompare cf)
        {
            if (x == 0)
            {
                yield break;
            }
            int c = Compare(x, cf);

            if (c > 0)
            {
                foreach (int a in Desc(GetRight(x), cf))
                {
                    yield return(a);
                }
            }
            if (c >= 0)
            {
                yield return(x);
            }
            foreach (int a in Desc(GetLeft(x), cf))
            {
                yield return(a);
            }
        }
Ejemplo n.º 7
0
        G.IEnumerable <int> Asc(int x, DCompare cf)
        {
            if (x == 0)
            {
                yield break;
            }
            int c = Compare(x, cf);

            if (c < 0)
            {
                foreach (int a in Asc(GetLeft(x), cf))
                {
                    yield return(a);
                }
            }
            if (c <= 0)
            {
                yield return(x);
            }
            foreach (int a in Asc(GetRight(x), cf))
            {
                yield return(a);                                // Is this doing extra compares when c <= 0?
            }
        }