12 #ifndef hifi_SequenceNumber_h
13 #define hifi_SequenceNumber_h
17 #include <glm/common.hpp>
21 class SequenceNumber {
25 using UType = uint32_t;
28 static const Type THRESHOLD = 0x03FFFFFF;
29 static const Type MAX = 0x07FFFFFF;
31 SequenceNumber() =
default;
32 SequenceNumber(
const SequenceNumber& other) : _value(other._value) {}
35 explicit SequenceNumber(
char* value) { _value = (*
reinterpret_cast<int32_t*
>(value)) & MAX; }
36 explicit SequenceNumber(Type value) { _value = (value <= MAX) ? ((value >= 0) ? value : 0) : MAX; }
37 explicit SequenceNumber(UType value) { _value = (value <= MAX) ? value : MAX; }
38 explicit operator Type()
const {
return _value; }
39 explicit operator UType()
const {
return static_cast<UType
>(_value); }
41 inline SequenceNumber& operator++() {
42 _value = (_value + 1) % (MAX + 1);
45 inline SequenceNumber& operator--() {
46 _value = (_value == 0) ? MAX : _value - 1;
49 inline SequenceNumber operator++(
int) {
50 SequenceNumber before = *
this;
54 inline SequenceNumber operator--(
int) {
55 SequenceNumber before = *
this;
60 inline SequenceNumber& operator=(
const SequenceNumber& other) {
61 _value = other._value;
64 inline SequenceNumber& operator+=(Type inc) {
65 _value = (_value + inc > MAX) ? _value + inc - (MAX + 1) : _value + inc;
68 inline SequenceNumber& operator-=(Type dec) {
69 _value = (_value < dec) ? MAX - (dec - _value + 1) : _value - dec;
73 inline bool operator==(
const SequenceNumber& other)
const {
74 return _value == other._value;
76 inline bool operator!=(
const SequenceNumber& other)
const {
77 return _value != other._value;
80 friend bool operator<(
const SequenceNumber& a,
const SequenceNumber& b);
81 friend bool operator>(
const SequenceNumber& a,
const SequenceNumber& b);
82 friend bool operator<=(
const SequenceNumber& a,
const SequenceNumber& b);
83 friend bool operator>=(
const SequenceNumber& a,
const SequenceNumber& b);
85 friend SequenceNumber operator+(
const SequenceNumber a,
const Type& b);
86 friend SequenceNumber operator+(
const Type& a,
const SequenceNumber b);
87 friend SequenceNumber operator-(
const SequenceNumber a,
const Type& b);
88 friend SequenceNumber operator-(
const Type& a,
const SequenceNumber b);
90 friend int seqlen(
const SequenceNumber& seq1,
const SequenceNumber& seq2);
91 friend int seqoff(
const SequenceNumber& seq1,
const SequenceNumber& seq2);
96 friend struct std::hash<SequenceNumber>;
98 static_assert(
sizeof(SequenceNumber) ==
sizeof(uint32_t),
"SequenceNumber invalid size");
101 inline bool operator<(
const SequenceNumber& a,
const SequenceNumber& b) {
102 return (glm::abs(a._value - b._value) < SequenceNumber::THRESHOLD) ? a._value < b._value : b._value < a._value;
105 inline bool operator>(
const SequenceNumber& a,
const SequenceNumber& b) {
106 return (glm::abs(a._value - b._value) < SequenceNumber::THRESHOLD) ? a._value > b._value : b._value > a._value;
109 inline bool operator<=(
const SequenceNumber& a,
const SequenceNumber& b) {
110 return (glm::abs(a._value - b._value) < SequenceNumber::THRESHOLD) ? a._value <= b._value : b._value <= a._value;
113 inline bool operator>=(
const SequenceNumber& a,
const SequenceNumber& b) {
114 return (glm::abs(a._value - b._value) < SequenceNumber::THRESHOLD) ? a._value >= b._value : b._value >= a._value;
118 inline SequenceNumber operator+(SequenceNumber a,
const SequenceNumber::Type& b) {
123 inline SequenceNumber operator+(
const SequenceNumber::Type& a, SequenceNumber b) {
128 inline SequenceNumber operator-(SequenceNumber a,
const SequenceNumber::Type& b) {
133 inline SequenceNumber operator-(
const SequenceNumber::Type& a, SequenceNumber b) {
138 int seqlen(
const SequenceNumber& seq1,
const SequenceNumber& seq2);
139 int seqoff(
const SequenceNumber& seq1,
const SequenceNumber& seq2);
144 template<>
struct hash<udt::SequenceNumber> {
145 size_t operator()(
const udt::SequenceNumber& SequenceNumber)
const {
146 return hash<unsigned long>()(SequenceNumber._value);