Пример #1
0
        private (DataHeader Header, Data Info) InsertInfo(int DataLen, int Pos)
        {
            var  TotalLen = DataLen + HeadSize;
            Data Gap;
            Data Data;

            if (PopGapMinLen(TotalLen, out Gap) == false)//// haven't free gap
            {
                var StreamLen = (int)Stream.Length;
                Stream.AddLen(TotalLen);
                Data = new Data()
                {
                    From = StreamLen,
                    Len  = TotalLen,
                    To   = StreamLen + TotalLen - 1
                };
            }
            else
            {
                Data = new Data()
                {
                    From = Gap.From,
                    Len  = TotalLen,
                    To   = Gap.From + TotalLen - 1
                };
                if (Gap.Len > TotalLen)
                {
                    Gap.Len  = Gap.Len - TotalLen;
                    Gap.From = Gap.From + TotalLen;
                    var NextGap = Gap;
                    if (PopNextGap(ref NextGap))
                    {
                        Gap.Len += NextGap.Len;
                        Gap.To   = NextGap.To;
                    }
                    InsertGap(Gap);
                }
            }

            var Header = new DataHeader();

            Header.DataLen = Data.Len;
            Keys.Insert(Data, Pos);
            if (Keys.Length == Pos + 1)
            {
                Header.NextData = -1;
            }
            else
            {
                Header.NextData = Keys[Pos + 1].From;
            }

            return(Header, Data);
        }