blob: a8f85a49c14f440fb332e411fe28eb7e294b8a05 [file] [log] [blame]
Brian Silvermanf7bd1c22015-12-24 16:07:11 -08001/*----------------------------------------------------------------------------*/
2/* Copyright (c) FIRST 2015. All Rights Reserved. */
3/* Open Source Software - may be modified and shared by FRC teams. The code */
4/* must be accompanied by the FIRST BSD license file in the root directory of */
5/* the project. */
6/*----------------------------------------------------------------------------*/
7
8#ifndef NT_SEQNUM_H_
9#define NT_SEQNUM_H_
10
11namespace nt {
12
13/* A sequence number per RFC 1982 */
14class SequenceNumber {
15 public:
16 SequenceNumber() : m_value(0) {}
17 explicit SequenceNumber(unsigned int value) : m_value(value) {}
18 unsigned int value() const { return m_value; }
19
20 SequenceNumber& operator++() {
21 ++m_value;
22 if (m_value > 0xffff) m_value = 0;
23 return *this;
24 }
25 SequenceNumber operator++(int) {
26 SequenceNumber tmp(*this);
27 operator++();
28 return tmp;
29 }
30
31 friend bool operator<(const SequenceNumber& lhs, const SequenceNumber& rhs);
32 friend bool operator>(const SequenceNumber& lhs, const SequenceNumber& rhs);
33 friend bool operator<=(const SequenceNumber& lhs, const SequenceNumber& rhs);
34 friend bool operator>=(const SequenceNumber& lhs, const SequenceNumber& rhs);
35 friend bool operator==(const SequenceNumber& lhs, const SequenceNumber& rhs);
36 friend bool operator!=(const SequenceNumber& lhs, const SequenceNumber& rhs);
37
38 private:
39 unsigned int m_value;
40};
41
42bool operator<(const SequenceNumber& lhs, const SequenceNumber& rhs);
43bool operator>(const SequenceNumber& lhs, const SequenceNumber& rhs);
44
45inline bool operator<=(const SequenceNumber& lhs, const SequenceNumber& rhs) {
46 return lhs == rhs || lhs < rhs;
47}
48
49inline bool operator>=(const SequenceNumber& lhs, const SequenceNumber& rhs) {
50 return lhs == rhs || lhs > rhs;
51}
52
53inline bool operator==(const SequenceNumber& lhs, const SequenceNumber& rhs) {
54 return lhs.m_value == rhs.m_value;
55}
56
57inline bool operator!=(const SequenceNumber& lhs, const SequenceNumber& rhs) {
58 return lhs.m_value != rhs.m_value;
59}
60
61} // namespace nt
62
63#endif // NT_SEQNUM_H_