예제 #1
0
        public bool TryEnqueueForDelivery(T value, out UdpReliableRecvResult result)
        {
            int distance = SequenceDistance(value.Sequence, sequenceNext, sequenceShift);
            int index    = (tail + distance) & mask;

            if (distance <= -nodes.Length || distance >= nodes.Length)
            {
                result = UdpReliableRecvResult.OutOfBounds;
                return(false);
            }

            if (distance < 0)
            {
                result = UdpReliableRecvResult.Old;
                return(false);
            }

            if (nodes[index].Received)
            {
                result = UdpReliableRecvResult.AlreadyExists;
                return(false);
            }

            nodes[index].Received = true;
            nodes[index].Value    = value;

            result = UdpReliableRecvResult.Added;
            return(true);
        }
예제 #2
0
 public bool Recv_TryEnqueue(T value, out UdpReliableRecvResult result)
 {
     return(recv.TryEnqueueForDelivery(value, out result));
 }