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); }
/// <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); }
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); }
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>(); }