s2n_quic_core/ack/
set.rs

1// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0
3
4//! A set of acknowledgments
5
6use crate::packet::number::{PacketNumber, PacketNumberRange};
7use core::ops::RangeInclusive;
8
9/// A set of Acknowledgments
10///
11/// The implementation of the set is allowed to store packet numbers in
12/// an arbitrary form.
13pub trait Set {
14    /// Returns whether the [`Set`] contains a given packet number
15    fn contains(&self, packet_number: PacketNumber) -> bool;
16
17    /// Smallest packet number in the set
18    fn smallest(&self) -> PacketNumber;
19
20    /// Largest packet number in the set
21    fn largest(&self) -> PacketNumber;
22
23    /// Returns the range of packet numbers contained in the set
24    fn as_range(&self) -> PacketNumberRange {
25        PacketNumberRange::new(self.smallest(), self.largest())
26    }
27}
28
29// A single packet number is also a set
30
31impl Set for PacketNumber {
32    fn contains(&self, packet_number: PacketNumber) -> bool {
33        *self == packet_number
34    }
35
36    fn smallest(&self) -> PacketNumber {
37        *self
38    }
39
40    fn largest(&self) -> PacketNumber {
41        *self
42    }
43}
44
45impl Set for RangeInclusive<PacketNumber> {
46    fn contains(&self, packet_number: PacketNumber) -> bool {
47        RangeInclusive::contains(self, &packet_number)
48    }
49
50    fn smallest(&self) -> PacketNumber {
51        *self.start()
52    }
53
54    fn largest(&self) -> PacketNumber {
55        *self.end()
56    }
57}
58
59impl Set for PacketNumberRange {
60    fn contains(&self, packet_number: PacketNumber) -> bool {
61        PacketNumberRange::contains(self, packet_number)
62    }
63
64    fn smallest(&self) -> PacketNumber {
65        self.start()
66    }
67
68    fn largest(&self) -> PacketNumber {
69        self.end()
70    }
71
72    fn as_range(&self) -> PacketNumberRange {
73        *self
74    }
75}