min()/max()/clamp()

熟练用kernel提供的API,可以避免重复造车,提高编程效率.
min_t 和 max_t 用于返回两个数中的最小值和最大值,这两个数的类型必须要一致.
#define min_t(type, x, y)                \
    __min(type, type,                \
          __UNIQUE_ID(min1_), __UNIQUE_ID(min2_),    \
          x, y)

#define max_t(type, x, y)                \
    __max(type, type,                \
          __UNIQUE_ID(min1_), __UNIQUE_ID(min2_),    \
          x, y)
例如下面这段code就返回1和base >> order的最大值,且这两个值都是unsigned long
    unsigned long order, base_pfn;
    base_pfn = max_t(unsigned long, 1, base >> order);


而min(x, y) 和 max(x, y)会返回两个数中的最小值和最大值,但是不用传递type,会用typeof 获得类型.
#define __min(t1, t2, min1, min2, x, y) ({        \
    t1 min1 = (x);                    \
    t2 min2 = (y);                    \
    (void) (&min1 == &min2);            \
    min1 < min2 ? min1 : min2; })
#define min(x, y)                    \
    __min(typeof(x), typeof(y),            \
          __UNIQUE_ID(min1_), __UNIQUE_ID(min2_),    \
          x, y)

#define __max(t1, t2, max1, max2, x, y) ({        \
    t1 max1 = (x);                    \
    t2 max2 = (y);                    \
    (void) (&max1 == &max2);            \
    max1 > max2 ? max1 : max2; })
#define max(x, y)                    \
    __max(typeof(x), typeof(y),            \
          __UNIQUE_ID(max1_), __UNIQUE_ID(max2_),    \
而clamp_t 用于判断db是否在3和15之内,如果比3小则返回3,比15大的返回15.在其间的话,返回自己本身

u8 pwr;
pwr = clamp_t(u8, db, 3, 15);

和下面这段code等价,可以用来简化编程
if(db <3)
  return 3
elif(db>15)
  return 15
else
  return db


其源代码如下:
#define clamp_t(type, val, lo, hi) min_t(type, max_t(type, val, lo), hi)

而clamp_val 是clamp_t的简化版,省去了tyle,改用typeof(val) 获取变量类型
#define clamp_val(val, lo, hi) clamp_t(typeof(val), val, lo, hi)

#define swap(a, b) \
    do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
swap 用于交换两个变量。

min3 和 max3分别返回三个数中的最小值和最大值
#define min3(x, y, z) min((typeof(x))min(x, y), z)
#define max3(x, y, z) max((typeof(x))max(x, y), z)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值