ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/shstr.h
Revision: 1.12
Committed: Mon Feb 5 02:07:40 2007 UTC (17 years, 3 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_0
Changes since 1.11: +12 -0 lines
Log Message:
remove many strcmps on shstr, added fast strcmp wrapper that only etsts for inequality

File Contents

# User Rev Content
1 root 1.2 #ifndef SHSTR_H__
2     #define SHSTR_H__
3    
4 root 1.8 #include "util.h"
5    
6     extern int buf_overflow (const char *buf1, const char *buf2, int bufsize);
7 root 1.5
8     struct shstr
9     {
10 root 1.8 static const char *null;
11    
12 root 1.5 const char *s;
13 root 1.4
14 root 1.7 static int &refcnt (const char *s)
15 root 1.5 {
16     return *((int *)s - 1);
17     }
18    
19 root 1.7 static int &length (const char *s)
20     {
21     return *((int *)s - 2);
22     }
23    
24     int &refcnt () const
25     {
26     return refcnt (s);
27     }
28    
29     int length () const
30     {
31 root 1.8 return length (s);
32 root 1.7 }
33    
34 root 1.5 static const char *find (const char *s);
35     static const char *intern (const char *s);
36    
37     static void gc (); // garbage collect a few strings
38    
39 root 1.6 // this is used for informational messages and the like
40 root 1.8 const char *operator &() const { return s; }
41 root 1.5
42 root 1.6 const char &operator [](int i) const { return s[i]; }
43 root 1.8 operator const char *() const { return s == null ? 0 : s; }
44 root 1.5
45     shstr ()
46 root 1.8 : s (null)
47 root 1.5 {
48     }
49    
50 root 1.6 shstr (const shstr &sh)
51 root 1.5 : s (sh.s)
52     {
53 root 1.8 ++refcnt ();
54 root 1.5 }
55    
56     explicit shstr (const char *s)
57     : s (intern (s))
58     {
59     }
60    
61     ~shstr ()
62     {
63 root 1.8 --refcnt ();
64 root 1.5 }
65    
66     const shstr &operator =(const shstr &sh)
67     {
68 root 1.8 --refcnt ();
69 root 1.5 s = sh.s;
70 root 1.8 ++refcnt ();
71 root 1.5
72     return *this;
73     }
74    
75     const shstr &operator =(const char *str)
76     {
77 root 1.8 --refcnt ();
78    
79     // this optimises the important case of str == constant 0
80     if (is_constant (str))
81     s = str ? intern (str) : null;
82     else
83     s = intern (str);
84 root 1.1
85 root 1.5 return *this;
86     }
87 root 1.10
88     bool operator ==(const shstr &b)
89     {
90     return s == b.s;
91     }
92    
93     bool operator !=(const shstr &b)
94     {
95     return !(*this == b);
96     }
97 root 1.5 };
98 root 1.1
99 root 1.5 inline int strlen (const shstr &sh)
100     {
101     return sh.length ();
102     }
103 root 1.2
104 root 1.12 inline int strcmp (const shstr &a, const shstr &b)
105     {
106     // TODO: use this to find all the occurences of people using strcmp
107     // all uses should be bogus, as we should be never interested in
108     // comparing shstr's alphabetically
109     #if 0
110     extern void do_not_use_strcmp_to_compare_shstr_values ();
111     do_not_use_strcmp_to_compare_shstr_values ();
112     #endif
113     return a != b;
114     }
115    
116 root 1.10 // only good for mass comparisons to shstr objects
117     struct shstr_cmp
118     {
119     const char *s;
120    
121     explicit shstr_cmp (const char *s)
122     : s (shstr::find (s))
123     {
124     }
125    
126 root 1.11 shstr_cmp (const shstr_cmp &sh)
127     : s (sh.s)
128     {
129     }
130    
131     shstr_cmp &operator =(const shstr_cmp sh) { s = sh.s; return *this; }
132 root 1.10 operator const char *() const { return s; }
133     };
134    
135     inline bool operator ==(const shstr_cmp &a, const shstr &b)
136 root 1.5 {
137     return a.s == b.s;
138     }
139 root 1.4
140 root 1.10 inline bool operator ==(const shstr &a, const shstr_cmp &b)
141 root 1.4 {
142 root 1.10 return b == a;
143 root 1.5 }
144 root 1.4
145 root 1.9 extern const shstr undead_name; /* Used in hit_player() in main.c */
146    
147 root 1.2 #endif
148