ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/shstr.h
Revision: 1.8
Committed: Sun Sep 3 23:33:01 2006 UTC (17 years, 9 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.7: +22 -11 lines
Log Message:
use alternative shstr representation, might or might not be faster, but does save code

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     #if 0
80     // this optimises the important case of str == constant 0
81     if (is_constant (str))
82     s = str ? intern (str) : null;
83     else
84     #endif
85     s = intern (str);
86 root 1.1
87 root 1.5 return *this;
88     }
89     };
90 root 1.1
91 root 1.5 inline int strlen (const shstr &sh)
92     {
93     return sh.length ();
94     }
95 root 1.2
96 root 1.5 inline bool operator ==(const shstr &a, const shstr &b)
97     {
98     return a.s == b.s;
99     }
100 root 1.4
101 root 1.5 inline bool operator !=(const shstr &a, const shstr &b)
102 root 1.4 {
103 root 1.5 return !(a == b);
104     }
105 root 1.4
106 root 1.2 #endif
107