| | | 1 | | // The pending message is the mailbox's internal queue item. It stores the message object and the |
| | | 2 | | // scheduled delivery time in simulation seconds. The mailbox dequeues this item once the simulation |
| | | 3 | | // time reaches the deliver at time. |
| | | 4 | | |
| | | 5 | | using System; |
| | | 6 | | |
| | | 7 | | public readonly struct PendingMessage : IComparable<PendingMessage> { |
| | 0 | 8 | | public Message Message { get; } |
| | | 9 | | |
| | | 10 | | // Absolute simulation time in seconds when the mailbox should deliver this message. |
| | 0 | 11 | | public float DeliverAt { get; } |
| | | 12 | | |
| | 0 | 13 | | public IAgent Sender => Message?.Sender; |
| | 0 | 14 | | public IAgent Receiver => Message?.Receiver; |
| | | 15 | | |
| | 0 | 16 | | public PendingMessage(Message message, float deliverAt) { |
| | 0 | 17 | | if (float.IsNaN(deliverAt) || float.IsInfinity(deliverAt) || deliverAt < 0f) { |
| | 0 | 18 | | throw new ArgumentOutOfRangeException(nameof(deliverAt), deliverAt, |
| | | 19 | | "DeliverAt must be finite and non-negative."); |
| | | 20 | | } |
| | 0 | 21 | | Message = message ?? throw new ArgumentNullException(nameof(message)); |
| | 0 | 22 | | DeliverAt = deliverAt; |
| | 0 | 23 | | } |
| | | 24 | | |
| | | 25 | | // Pending messages are sorted based on the deliver at time. |
| | 0 | 26 | | public int CompareTo(PendingMessage other) => DeliverAt.CompareTo(other.DeliverAt); |
| | | 27 | | } |