ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/util.h
(Generate patch)

Comparing deliantra/server/include/util.h (file contents):
Revision 1.93 by root, Sat Nov 7 18:30:05 2009 UTC vs.
Revision 1.96 by root, Wed Nov 11 03:52:44 2009 UTC

186 int32_t d = b - a; 186 int32_t d = b - a;
187 d &= d >> 31; 187 d &= d >> 31;
188 return b - d; 188 return b - d;
189} 189}
190 190
191// this is much faster than crossfires original algorithm 191// this is much faster than crossfire's original algorithm
192// on modern cpus 192// on modern cpus
193inline int 193inline int
194isqrt (int n) 194isqrt (int n)
195{ 195{
196 return (int)sqrtf ((float)n); 196 return (int)sqrtf ((float)n);
240absdir (int d) 240absdir (int d)
241{ 241{
242 return ((d - 1) & 7) + 1; 242 return ((d - 1) & 7) + 1;
243} 243}
244 244
245// avoid ctz name because netbsd or freebsd spams it's namespace with it
246#if GCC_VERSION(3,4)
247static inline int least_significant_bit (uint32_t x)
248{
249 return __builtin_ctz (x);
250}
251#else
252int least_significant_bit (uint32_t x);
253#endif
254
255#define for_all_bits_sparse_32(mask, idxvar) \
256 for (uint32_t idxvar, mask_ = mask; \
257 mask_ && ((idxvar = least_significant_bit (mask_)), mask_ &= ~(1 << idxvar), 1);)
258
245extern ssize_t slice_alloc; // statistics 259extern ssize_t slice_alloc; // statistics
246 260
247void *salloc_ (int n) throw (std::bad_alloc); 261void *salloc_ (int n) throw (std::bad_alloc);
248void *salloc_ (int n, void *src) throw (std::bad_alloc); 262void *salloc_ (int n, void *src) throw (std::bad_alloc);
249 263
546typedef refptr<object> object_ptr; 560typedef refptr<object> object_ptr;
547typedef refptr<archetype> arch_ptr; 561typedef refptr<archetype> arch_ptr;
548typedef refptr<client> client_ptr; 562typedef refptr<client> client_ptr;
549typedef refptr<player> player_ptr; 563typedef refptr<player> player_ptr;
550 564
565#define STRHSH_NULL 2166136261
566
567static inline uint32_t
568strhsh (const char *s)
569{
570 // use FNV-1a hash (http://isthe.com/chongo/tech/comp/fnv/)
571 // it is about twice as fast as the one-at-a-time one,
572 // with good distribution.
573 // FNV-1a is faster on many cpus because the multiplication
574 // runs concurrently with the looping logic.
575 uint32_t hash = STRHSH_NULL;
576
577 while (*s)
578 hash = (hash ^ *s++) * 16777619;
579
580 return hash;
581}
582
583static inline uint32_t
584memhsh (const char *s, size_t len)
585{
586 uint32_t hash = STRHSH_NULL;
587
588 while (len--)
589 hash = (hash ^ *s++) * 16777619;
590
591 return hash;
592}
593
551struct str_hash 594struct str_hash
552{ 595{
553 std::size_t operator ()(const char *s) const 596 std::size_t operator ()(const char *s) const
554 { 597 {
555#if 0
556 uint32_t hash = 0;
557
558 /* use the one-at-a-time hash function, which supposedly is
559 * better than the djb2-like one used by perl5.005, but
560 * certainly is better then the bug used here before.
561 * see http://burtleburtle.net/bob/hash/doobs.html
562 */
563 while (*s)
564 {
565 hash += *s++;
566 hash += hash << 10;
567 hash ^= hash >> 6;
568 }
569
570 hash += hash << 3;
571 hash ^= hash >> 11;
572 hash += hash << 15;
573#else
574 // use FNV-1a hash (http://isthe.com/chongo/tech/comp/fnv/)
575 // it is about twice as fast as the one-at-a-time one,
576 // with good distribution.
577 // FNV-1a is faster on many cpus because the multiplication
578 // runs concurrent with the looping logic.
579 uint32_t hash = 2166136261;
580
581 while (*s)
582 hash = (hash ^ *s++) * 16777619;
583#endif
584
585 return hash; 598 return strhsh (s);
599 }
600
601 std::size_t operator ()(const shstr &s) const
602 {
603 return strhsh (s);
586 } 604 }
587}; 605};
588 606
589struct str_equal 607struct str_equal
590{ 608{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines