--- deliantra/server/include/util.h 2007/02/15 15:43:36 1.37 +++ deliantra/server/include/util.h 2007/04/21 22:57:16 1.41 @@ -20,7 +20,7 @@ #include // use a gcc extension for auto declarations until ISO C++ sanctifies them -#define AUTODECL(var,expr) typeof(expr) var = (expr) +#define auto(var,expr) typeof(expr) var = (expr) // very ugly macro that basicaly declares and initialises a variable // that is in scope for the next statement only @@ -50,11 +50,17 @@ // lots of stuff taken from FXT /* Rotate right. This is used in various places for checksumming */ -//TODO: this sucks, use a better checksum algo +//TODO: that sucks, use a better checksum algo static inline uint32_t -rotate_right (uint32_t c) +rotate_right (uint32_t c, uint32_t count = 1) { - return (c << 31) | (c >> 1); + return (c << (32 - count)) | (c >> count); +} + +static inline uint32_t +rotate_left (uint32_t c, uint32_t count = 1) +{ + return (c >> (32 - count)) | (c << count); } // Return abs(a-b) @@ -261,7 +267,7 @@ uint32_t operator ()(uint32_t r_max) { return is_constant (r_max) - ? this->next () % r_max + ? (next () * (uint64_t)r_max) >> 32U : get_range (r_max); } @@ -269,7 +275,7 @@ int operator () (int r_min, int r_max) { return is_constant (r_min) && is_constant (r_max) - ? r_min + (*this) (max (r_max - r_min + 1, 1)) + ? r_min + operator ()(max (r_max - r_min + 1, 1)) : get_range (r_min, r_max); } @@ -395,7 +401,7 @@ void erase (T *obj) { assert (obj->*index); - int pos = obj->*index; + unsigned int pos = obj->*index; obj->*index = 0; if (pos < this->size ())