webrtc 判断rtp seq新旧函数

本文介绍了C++中三个模板函数,用于比较无符号整数的顺序,判断一个值是否比另一个更老或更新。通过maxDist常量和不同的计算方法实现高效比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

template <typename T, T M = 0>
inline bool AheadOf(T a, T b) {
  // 必须为无符号数
  static_assert(std::is_unsigned<T>::value,
                "Type must be an unsigned integer.");
  return a != b && AheadOrAt<T, M>(a, b);
}
  • 比较 a 和 b 的顺序
  • b 排在 a 前面,返回真,否则假
template <typename T, T M>
inline typename std::enable_if<(M == 0), bool>::type AheadOrAt(T
    a, T b) {
  static_assert(std::is_unsigned<T>::value,
                "Type must be an unsigned integer.");
  const T maxDist = std::numeric_limits<T>::max() / 2 + T(1);
  // 规定特殊情况
  if (a - b == maxDist)
    return b < a;
  // 调用顺序有调换
  return ForwardDiff(b, a) < maxDist;
}
template <typename T, T M>
inline typename std::enable_if<(M == 0), T>::type ForwardDiff(T a, T b) {
  static_assert(std::is_unsigned<T>::value,
                "Type must be an unsigned integer.");
  // 调用顺序调换,使用AheadOrAt参数 实际调用是 a-b
  return b - a;
}

使用AheadOrAt中的 a,b 定义

T 默认为 uint16_t 类型,maxDist = 32768

  1. a=1000, b = 1001 => a - b = -1, 转换为 uint16_t 为 65535, 大于 maxDist,return false => a 是比 b 更老的包
  2. a=1001, b = 1000 => a - b = 1, 转换为 uint16_t 为 1, 小于 maxDist,return true => a 是比 b 更新的包
  3. a=1, b=65534 => a - b = -65533,转换为 uint16_t 为 3,小于 maxDist,return true
  4. a=65534, b=1 => a - b = 65533,转换为 uint16_t 为 65533,大于 maxDist,return false
    5533,转换为 uint16_t 为 65533,大于 maxDist,return false
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值