1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

//! A set of acknowledgments

use crate::packet::number::{PacketNumber, PacketNumberRange};
use core::ops::RangeInclusive;

/// A set of Acknowledgments
///
/// The implementation of the set is allowed to store packet numbers in
/// an arbitrary form.
pub trait Set {
    /// Returns whether the [`Set`] contains a given packet number
    fn contains(&self, packet_number: PacketNumber) -> bool;

    /// Smallest packet number in the set
    fn smallest(&self) -> PacketNumber;

    /// Largest packet number in the set
    fn largest(&self) -> PacketNumber;

    /// Returns the range of packet numbers contained in the set
    fn as_range(&self) -> PacketNumberRange {
        PacketNumberRange::new(self.smallest(), self.largest())
    }
}

// A single packet number is also a set

impl Set for PacketNumber {
    fn contains(&self, packet_number: PacketNumber) -> bool {
        *self == packet_number
    }

    fn smallest(&self) -> PacketNumber {
        *self
    }

    fn largest(&self) -> PacketNumber {
        *self
    }
}

impl Set for RangeInclusive<PacketNumber> {
    fn contains(&self, packet_number: PacketNumber) -> bool {
        RangeInclusive::contains(self, &packet_number)
    }

    fn smallest(&self) -> PacketNumber {
        *self.start()
    }

    fn largest(&self) -> PacketNumber {
        *self.end()
    }
}

impl Set for PacketNumberRange {
    fn contains(&self, packet_number: PacketNumber) -> bool {
        PacketNumberRange::contains(self, packet_number)
    }

    fn smallest(&self) -> PacketNumber {
        self.start()
    }

    fn largest(&self) -> PacketNumber {
        self.end()
    }

    fn as_range(&self) -> PacketNumberRange {
        *self
    }
}