69 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef HV_MATH_H_
 | |
| #define HV_MATH_H_
 | |
| 
 | |
| #include <math.h>
 | |
| 
 | |
| static inline unsigned long floor2e(unsigned long num) {
 | |
|     unsigned long n = num;
 | |
|     int e = 0;
 | |
|     while (n>>=1) ++e;
 | |
|     unsigned long ret = 1;
 | |
|     while (e--) ret<<=1;
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| static inline unsigned long ceil2e(unsigned long num) {
 | |
|     // 2**0 = 1
 | |
|     if (num == 0 || num == 1)   return 1;
 | |
|     unsigned long n = num - 1;
 | |
|     int e = 1;
 | |
|     while (n>>=1) ++e;
 | |
|     unsigned long ret = 1;
 | |
|     while (e--) ret<<=1;
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| // varint little-endian
 | |
| // MSB
 | |
| static inline int varint_encode(long long value, unsigned char* buf) {
 | |
|     unsigned char ch;
 | |
|     unsigned char *p = buf;
 | |
|     int bytes = 0;
 | |
|     do {
 | |
|         ch = value & 0x7F;
 | |
|         value >>= 7;
 | |
|         *p++ = value == 0 ? ch : (ch | 0x80);
 | |
|         ++bytes;
 | |
|     } while (value);
 | |
|     return bytes;
 | |
| }
 | |
| 
 | |
| // @param[IN|OUT] len: in=>buflen, out=>varint bytesize
 | |
| static inline long long varint_decode(const unsigned char* buf, int* len) {
 | |
|     long long ret = 0;
 | |
|     int bytes = 0, bits = 0;
 | |
|     const unsigned char *p = buf;
 | |
|     do {
 | |
|         if (len && *len && bytes == *len) {
 | |
|             // Not enough length
 | |
|             *len = 0;
 | |
|             return 0;
 | |
|         }
 | |
|         ret |= ((long long)(*p & 0x7F)) << bits;
 | |
|         ++bytes;
 | |
|         if ((*p & 0x80) == 0) {
 | |
|             // Found end
 | |
|             if (len) *len = bytes;
 | |
|             return ret;
 | |
|         }
 | |
|         ++p;
 | |
|         bits += 7;
 | |
|     } while(bytes < 10);
 | |
| 
 | |
|     // Not found end
 | |
|     if (len) *len = -1;
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| #endif // HV_MATH_H_
 | 
