示例#1
0
        public bool OnGetEnumerator(EntriesInput input, EntriesOutput output)
        {
            if (null == raout)
            {
                raout = new RandomAccessOutput(output);
            }
            if (null == raentries)
            {
                raentries = new RandomAccessEntries();
            }
            raentries.SetInput(input);
            byte[] firstkeybuf, xkeybuf;
            int    firstkeyoffset, xkeyoffset;
            int    firstkeylen, xkeylen;

            for (; i < input.entries.Count;)
            {
                input.entries[i].LocateKey(input, out firstkeybuf, out firstkeyoffset, out firstkeylen);
                int len = 1;
                for (int j = i + 1; j < input.entries.Count; j++)
                {
                    bool nomatch = false;
                    input.entries[j].LocateKey(input, out xkeybuf, out xkeyoffset, out xkeylen);
                    if (firstkeylen != xkeylen)
                    {
                        break;
                    }
                    for (int ki = 0; ki != xkeylen; ki++)
                    {
                        if (xkeybuf[xkeyoffset + ki] != firstkeybuf[firstkeyoffset + ki])
                        {
                            nomatch = true;
                            break;
                        }
                    }
                    if (nomatch)
                    {
                        break;
                    }
                    len++;
                }
                raentries.set(i, len);
                Reduce(raentries[0].Key, raentries, raout);
                i += len;
                return(true); // Continue.
            }
            i = 0;
            return(false); // At end; stop.
        }