12#include "ns3/assert.h"
13#include "ns3/type-name.h"
109template <typename NUMERIC_TYPE, uint8_t NUM_BITS = std::numeric_limits<NUMERIC_TYPE>::digits>
110 requires std::unsigned_integral<std::remove_cv_t<NUMERIC_TYPE>> && (NUM_BITS < 64) &&
111 (NUM_BITS <= std::numeric_limits<NUMERIC_TYPE>::digits)
126 static constexpr NUMERIC_TYPE
N_BITS{NUM_BITS};
137 "SequenceNumber: " <<
static_cast<uint64_t
>(value)
138 <<
" is outside the allowed range [0, "
139 <<
static_cast<uint64_t
>(
MAX_VALUE) <<
"]");
151 "SequenceNumber: " <<
static_cast<uint64_t
>(value)
152 <<
" is outside the allowed range [0, "
153 <<
static_cast<uint64_t
>(
MAX_VALUE) <<
"]");
270 NUMERIC_TYPE val =
m_value + delta;
292 NUMERIC_TYPE val =
m_value - delta;
315 int64_t diff =
static_cast<int64_t
>(
m_value) -
static_cast<int64_t
>(other.
m_value);
316 static constexpr auto MAX_VALUE_D =
static_cast<int64_t
>(
MAX_VALUE);
317 static constexpr auto HALF_MAX_VALUE_D =
static_cast<int64_t
>(
HALF_MAX_VALUE);
319 if (diff > HALF_MAX_VALUE_D)
321 return (diff - 1 - MAX_VALUE_D);
323 else if (diff < -HALF_MAX_VALUE_D)
325 return (diff + 1 + MAX_VALUE_D);
360 return std::strong_ordering::equivalent;
365 return std::strong_ordering::greater;
367 return std::strong_ordering::less;
376 template <
typename NUMERIC_TYPE2, u
int8_t NUM_BITS2>
386 template <
typename NUMERIC_TYPE2, u
int8_t NUM_BITS2>
422 static constexpr NUMERIC_TYPE
MAX_VALUE = NUM_BITS < std::numeric_limits<NUMERIC_TYPE>::digits
423 ? (NUMERIC_TYPE{1} << NUM_BITS) - 1
424 :
std::numeric_limits<NUMERIC_TYPE>::max();
437template <
typename NUMERIC_TYPE, u
int8_t NUM_BITS>
441 os << static_cast<uint64_t>(val.
m_value);
452template <
typename NUMERIC_TYPE, u
int8_t NUM_BITS>
460 "SequenceNumber: " <<
static_cast<uint64_t
>(value)
461 <<
" is outside the allowed range [0, "
462 <<
static_cast<uint64_t
>(val.
MAX_VALUE) <<
"]");
Generic "sequence number" class.
constexpr NUMERIC_TYPE GetValue() const
Extracts the numeric value of the sequence number.
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator|(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator-(SIGNED_TYPE delta) const
Subtraction operator for subtracting numeric value from sequence number.
bool operator||(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete
SequenceNumber< NUMERIC_TYPE, NUM_BITS > & operator=(NUMERIC_TYPE value)
Constructs a SequenceNumber from an assignment of given value.
static constexpr uint32_t MAX_VALUE
constexpr bool operator==(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &other) const
Equality operator for comparing sequence number.
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator+(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &other) const
Operator defining addition of two sequence numbers.
friend std::istream & operator>>(std::istream &is, const SequenceNumber< NUMERIC_TYPE2, NUM_BITS2 > &val)
For loading sequence number from input streams.
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator--(int)
Postfix decrement operator.
std::make_signed_t< NUMERIC_TYPE > SIGNED_TYPE
SIGNED_TYPE is used in some operators, and is the signed counterpart of NUMERIC_TYPE.
SequenceNumber< NUMERIC_TYPE, NUM_BITS > & operator+=(SIGNED_TYPE value)
Plus equals operator.
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator+(SIGNED_TYPE delta) const
Addition operator for adding numeric value to sequence number.
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator%(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator&(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete
static constexpr size_t N_SEQUENCE_NUMBERS
friend std::ostream & operator<<(std::ostream &os, const SequenceNumber< NUMERIC_TYPE2, NUM_BITS2 > &val)
For printing sequence number.
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator/(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete
bool operator&&(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete
SequenceNumber< NUMERIC_TYPE, NUM_BITS > & operator-=(SIGNED_TYPE value)
Minus equals operator.
int64_t operator-(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &other) const
Subtraction operator for subtracting a sequence number from another sequence number.
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator++()
Prefix increment operator.
static constexpr uint32_t HALF_MAX_VALUE
static constexpr uint32_t N_BITS
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator>>(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator--()
Prefix decrement operator.
SequenceNumber(NUMERIC_TYPE value)
Constructs a SequenceNumber with the given value.
constexpr std::strong_ordering operator<=>(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &other) const
Spaceship comparison operator.
bool operator!() const =delete
SequenceNumber< NUMERIC_TYPE, NUM_BITS > & operator-=(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &)=delete
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator~() const =delete
SequenceNumber< NUMERIC_TYPE, NUM_BITS > & operator+=(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &)=delete
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator*(const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete
SequenceNumber< NUMERIC_TYPE, NUM_BITS > operator++(int)
Postfix increment operator.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
#define TYPENAMEGET_DEFINE(T)
Macro that defines a template specialization for TypeNameGet<T>() .
SequenceNumber< uint16_t > SequenceNumber16
16 bit Sequence number.
void(*)(SequenceNumber16 oldValue, SequenceNumber16 newValue) SequenceNumber16
TracedValue callback signature for SequenceNumber16.
void(*)(SequenceNumber32 oldValue, SequenceNumber32 newValue) SequenceNumber32
TracedValue callback signature for SequenceNumber32.
void(*)(SequenceNumber8 oldValue, SequenceNumber8 newValue) SequenceNumber8
TracedValue callback signature for SequenceNumber8.
SequenceNumber< uint8_t > SequenceNumber8
8 bit Sequence number.
SequenceNumber< uint32_t > SequenceNumber32
32 bit Sequence number.
auto operator^(const TracedValue< T > &lhs, const TracedValue< U > &rhs) -> TracedValue< decltype(lhs.Get() ^ rhs.Get())>
Infix arithmetic operator for TracedValue.
TracedValue Callback function types.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::ostream & operator<<(std::ostream &os, const Angles &a)
std::istream & operator>>(std::istream &is, Angles &a)