diff options
author | Bart Massey <bart@cs.pdx.edu> | 2007-12-08 15:27:04 -0800 |
---|---|---|
committer | Bart Massey <bart@cs.pdx.edu> | 2007-12-08 15:27:04 -0800 |
commit | 3be17a79990379715f8f8d03823596db28781d2d (patch) | |
tree | c6bf302dd2808cb15d8b5c3fad94129a7b533897 | |
parent | 0a2f79698781d4576a5b6c6086318212108b4eb4 (diff) |
fixed existing roundups, added rounddowns
-rw-r--r-- | aux/xcb_bitops.h | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/aux/xcb_bitops.h b/aux/xcb_bitops.h index 6462af4..48c3401 100644 --- a/aux/xcb_bitops.h +++ b/aux/xcb_bitops.h @@ -91,14 +91,30 @@ xcb_popcount(uint32_t x) * * Rounds @p base up to a multiple of @p pad, where @p pad * is a power of two. The more general case is handled by - * xcb_roundup_2(). + * xcb_roundup(). * @ingroup xcb__bitops */ _X_INLINE static uint32_t xcb_roundup_2 (uint32_t base, uint32_t pad) { - uint32_t b = base + pad - 1; - return b & ~(pad - 1); + return (base + pad - 1) & -pad; +} + +/** + * Round down to the next power-of-two unit size. + * @param base Number to be rounded down. + * @param pad Multiple to be rounded to; must be a power of two. + * @return Rounded-down number. + * + * Rounds @p base down to a multiple of @p pad, where @p pad + * is a power of two. The more general case is handled by + * xcb_rounddown(). + * @ingroup xcb__bitops + */ +_X_INLINE static uint32_t +xcb_rounddown_2 (uint32_t base, uint32_t pad) +{ + return base & -pad; } /** @@ -119,8 +135,30 @@ xcb_roundup (uint32_t base, uint32_t pad) uint32_t b = base + pad - 1; /* faster if pad is a power of two */ if (((pad - 1) & pad) == 0) - return b & ~(pad - 1); - return b % pad; + return b & -pad; + return b - b % pad; +} + + +/** + * Round down to the next unit size. + * @param base Number to be rounded down. + * @param pad Multiple to be rounded to. + * @return Rounded-down number. + * + * This is a general routine for rounding @p base down + * to a multiple of @p pad. If you know that @p pad + * is a power of two, you should probably call xcb_rounddown_2() + * instead. + * @ingroup xcb__bitops + */ +_X_INLINE static uint32_t +xcb_rounddown (uint32_t base, uint32_t pad) +{ + /* faster if pad is a power of two */ + if (((pad - 1) & pad) == 0) + return base & -pad; + return base - base % pad; } |