diff -r 0998a43cc155 -r ca99a81745fe src/Utility.h --- a/src/Utility.h Sat Dec 29 00:55:38 2012 -0800 +++ b/src/Utility.h Tue Jan 01 15:34:07 2013 -0800 @@ -21,6 +21,7 @@ #include #include +#include #include "../include/keima_util.h" #ifdef _MSC_VER # include @@ -47,28 +48,33 @@ static const size_t kGB = 1024 * kMB; template -class AutoVec +class AutoFree { T *t_; public: - AutoVec() + AutoFree() : t_(NULL) { } - AutoVec(T *t) + AutoFree(T *t) : t_(t) { } - ~AutoVec() { - delete [] t_; + ~AutoFree() { + free(t_); } - operator T *() { + T *take() { + T *t = t_; + t_ = NULL; + return t; + } + T *operator *() const { return t_; } void operator =(T *t) { if (t_) - delete [] t_; + free(t_); t_ = t; } }; @@ -116,11 +122,11 @@ static inline uint32 HashInt32(int32 a) { - a = (a ^ 61) ^ (a >> 16); - a = a + (a << 3); - a = a ^ (a >> 4); - a = a * 0x27d4eb2d; - a = a ^ (a >> 15); + a = (a ^ 61) ^ (a >> 16); + a = a + (a << 3); + a = a ^ (a >> 4); + a = a * 0x27d4eb2d; + a = a ^ (a >> 15); return a; } @@ -128,12 +134,12 @@ static inline uint32 HashInt64(int64 key) { - key = (~key) + (key << 18); // key = (key << 18) - key - 1; - key = key ^ (uint64(key) >> 31); - key = key * 21; // key = (key + (key << 2)) + (key << 4); - key = key ^ (uint64(key) >> 11); - key = key + (key << 6); - key = key ^ (uint64(key) >> 22); + key = (~key) + (key << 18); // key = (key << 18) - key - 1; + key = key ^ (uint64(key) >> 31); + key = key * 21; // key = (key + (key << 2)) + (key << 4); + key = key ^ (uint64(key) >> 11); + key = key + (key << 6); + key = key ^ (uint64(key) >> 22); return uint32(key); } @@ -161,11 +167,11 @@ # endif return rval; #else - size_t bit; - asm("bsr %1, %0\n" - : "=r" (bit) - : "rm" (number)); - return bit; + size_t bit; + asm("bsr %1, %0\n" + : "=r" (bit) + : "rm" (number)); + return bit; #endif } @@ -183,11 +189,11 @@ # endif return rval; #else - size_t bit; - asm("bsf %1, %0\n" - : "=r" (bit) - : "rm" (number)); - return bit; + size_t bit; + asm("bsf %1, %0\n" + : "=r" (bit) + : "rm" (number)); + return bit; #endif } @@ -253,7 +259,7 @@ #define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0])) #define STATIC_ASSERT(cond) extern int static_assert_f(int a[(cond) ? 1 : -1]) -#define IS_ALIGNED(addr, alignment) (!(uintptr_t(addr) & ((alignment) - 1))) +#define IS_ALIGNED(addr, alignment) (!(uintptr_t(addr) & ((alignment) - 1))) template static inline bool