You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.3 KiB
66 lines
1.3 KiB
|
|
#ifndef INNOEXTRACT_UTIL_UTIL_HPP |
|
#define INNOEXTRACT_UTIL_UTIL_HPP |
|
|
|
#define ARRAY_SIZE(array) (sizeof(array)/sizeof(*(array))) |
|
|
|
template <typename T> |
|
inline T ceildiv(T num, T denom) { |
|
return (num + (denom - T(1))) / denom; |
|
} |
|
|
|
template <class T> |
|
inline bool is_power_of_2(const T & n) { |
|
return n > 0 && (n & (n - 1)) == 0; |
|
} |
|
|
|
template <class T1, class T2> |
|
inline T2 mod_power_of_2(const T1 & a, const T2 & b) { |
|
return T2(a) & (b - 1); |
|
} |
|
|
|
namespace detail { |
|
|
|
template <bool overflow> |
|
struct safe_shifter { |
|
|
|
template <class T> |
|
static inline T right_shift(T, unsigned int) { |
|
return 0; |
|
} |
|
|
|
template <class T> |
|
static inline T left_shift(T, unsigned int) { |
|
return 0; |
|
} |
|
|
|
}; |
|
|
|
template<> |
|
struct safe_shifter<false> { |
|
|
|
template <class T> |
|
static inline T right_shift(T value, unsigned int bits) { |
|
return value >> bits; |
|
} |
|
|
|
template <class T> |
|
static inline T left_shift(T value, unsigned int bits) { |
|
return value << bits; |
|
} |
|
|
|
}; |
|
|
|
} // namespace detail |
|
|
|
template <unsigned int bits, class T> |
|
inline T safe_right_shift(T value) { |
|
return detail::safe_shifter<(bits >= (8 * sizeof(T)))>::right_shift(value, bits); |
|
} |
|
|
|
template <unsigned int bits, class T> |
|
inline T safe_left_shift(T value) { |
|
return detail::safe_shifter<(bits >= (8 * sizeof(T)))>::left_shift(value, bits); |
|
} |
|
|
|
#endif // INNOEXTRACT_UTIL_UTIL_HPP
|
|
|