/// <summary> /// Merges two receive buffers. Merging preserves sequencing of messages, and drops all messages that has been /// safely acknowledged by any of the participating buffers. Also updates the expected sequence numbers. /// </summary> /// <param name="other">The receive buffer to merge with</param> /// <returns>The merged receive buffer</returns> public AckedReceiveBuffer <T> MergeFrom(AckedReceiveBuffer <T> other) { var mergedLastDelivered = SeqNo.Max(this.LastDelivered, other.LastDelivered); Buf.UnionWith(other.Buf); Buf.RemoveWhere(x => x.Seq < mergedLastDelivered); return(Copy(mergedLastDelivered, SeqNo.Max(this.CumulativeAck, other.CumulativeAck), Buf)); }
/// <summary> /// Puts a sequenced message in the receive buffer returning a new buffer. /// </summary> /// <param name="arrivedMsg">Message to be put into the buffer</param> /// <returns>The updated buffer containing the message</returns> public AckedReceiveBuffer <T> Receive(T arrivedMsg) { if (arrivedMsg.Seq > LastDelivered && !Buf.Contains(arrivedMsg)) { Buf.Add(arrivedMsg); } return(Copy(cumulativeAck: SeqNo.Max(arrivedMsg.Seq, CumulativeAck), buffer: Buf)); }
/// <summary> /// Merges two receive buffers. Merging preserves sequencing of messages, and drops all messages that has been /// safely acknowledged by any of the participating buffers. Also updates the expected sequence numbers. /// </summary> /// <param name="other">The receive buffer to merge with</param> /// <returns>The merged receive buffer</returns> public AckedReceiveBuffer <T> MergeFrom(AckedReceiveBuffer <T> other) { var mergedLastDelivered = SeqNo.Max(this.LastDelivered, other.LastDelivered); return(Copy(mergedLastDelivered, SeqNo.Max(this.CumulativeAck, other.CumulativeAck), Buf.Union(other.Buf).Where(x => x.Seq > mergedLastDelivered).ToImmutableSortedSet(Comparer))); }