예제 #1
0
        private RLEElement[] RepeatsToArray()
        {
            RLEElement[] array = new RLEElement[repeats.Count];
            int          count = repeats.Count;

            for (int i = 1; i <= count; i++)
            {
                array[count - i] = repeats.Pop();
            }
            repeats = new Stack <RLEElement>();
            return(array);
        }
예제 #2
0
        /// <summary>
        /// Write element
        /// </summary>
        /// <param name="element">Element data</param>
        public void Write(byte[] element)
        {
            RLEElement elem = new RLEElement(element);

            if (repeats.Count == 0)
            {
                repeats.Push(elem);
                return;
            }
            if (repeats.Peek() == elem)
            {
                repeats.Push(elem);
                return;
            }
            FlushRepeats();
            repeats.Push(elem);
        }
예제 #3
0
        public int CompareTo(object obj)
        {
            if (!(obj is RLEElement))
            {
                throw new ArgumentException();
            }
            RLEElement second = obj as RLEElement;

            if (second.Length != Length)
            {
                return(Length.CompareTo(second.Length));
            }
            for (int i = 0; i < Length; i++)
            {
                if (data[i] != second.data[i])
                {
                    return(data[i].CompareTo(second.data[i]));
                }
            }
            return(0);
        }
예제 #4
0
        private void FlushRepeats()
        {
            if (repeats.Count < ElementLength + 2)
            {
                buffer.AddRange(RepeatsToArray());
                return;
            }
            if (buffer.Count != 0)
            {
                FlushBuffer();
            }
            RLEElement elemnt  = repeats.Peek();
            int        toWrite = repeats.Count;

            while (toWrite > short.MaxValue)
            {
                baseStream.WriteBytesOrdered(BitConverter.GetBytes((short)(-short.MaxValue)));
                baseStream.WriteBytesOrdered(elemnt.Data);
                toWrite -= short.MaxValue;
            }
            baseStream.WriteBytesOrdered(BitConverter.GetBytes((short)(-toWrite)));
            baseStream.WriteBytesOrdered(elemnt.Data);
            repeats = new Stack <RLEElement>();
        }