ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/shstr.C
(Generate patch)

Comparing deliantra/server/common/shstr.C (file contents):
Revision 1.7 by root, Sun Sep 3 23:33:00 2006 UTC vs.
Revision 1.9 by root, Mon Sep 4 17:16:19 2006 UTC

6#include <cstdlib> 6#include <cstdlib>
7 7
8#include <tr1/unordered_set> 8#include <tr1/unordered_set>
9 9
10#include "shstr.h" 10#include "shstr.h"
11#include "util.h"
11 12
12struct hash
13{
14 std::size_t operator ()(const char *s) const
15 {
16 unsigned long hash = 0;
17 unsigned int i = 0;
18
19 /* use the one-at-a-time hash function, which supposedly is
20 * better than the djb2-like one used by perl5.005, but
21 * certainly is better then the bug used here before.
22 * see http://burtleburtle.net/bob/hash/doobs.html
23 */
24 while (*s)
25 {
26 hash += *s++;
27 hash += hash << 10;
28 hash ^= hash >> 6;
29 }
30
31 hash += hash << 3;
32 hash ^= hash >> 11;
33 hash += hash << 15;
34
35 return hash;
36 }
37};
38
39struct equal
40{
41 bool operator ()(const char *a, const char *b) const
42 {
43 return !strcmp (a, b);
44 }
45};
46
47typedef std::tr1::unordered_set<const char *, hash, equal> HT; 13typedef std::tr1::unordered_set<const char *, str_hash, str_equal> HT;
48 14
49static HT ht; 15static HT ht;
50 16
51static const char *makevec (const char *s) 17static const char *makevec (const char *s)
52{ 18{
57 shstr::length (v) = len; 23 shstr::length (v) = len;
58 shstr::refcnt (v) = 1; 24 shstr::refcnt (v) = 1;
59 25
60 memcpy ((char *)v, s, len + 1); 26 memcpy ((char *)v, s, len + 1);
61 27
62 return s; 28 return v;
63} 29}
64 30
65const char *shstr::null = makevec ("<nil>"); 31const char *shstr::null = makevec ("<nil>");
32
33// what weird misoptimisation is this again?
34const shstr undead_name ("undead");
66 35
67const char * 36const char *
68shstr::find (const char *s) 37shstr::find (const char *s)
69{ 38{
70 if (!s) 39 if (!s)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines