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.5 by pippijn, Thu Sep 7 20:03:20 2006 UTC vs.
Revision 1.9 by root, Tue Sep 12 18:15:34 2006 UTC

8#endif 8#endif
9 9
10// makes dynamically allocated objects zero-initialised 10// makes dynamically allocated objects zero-initialised
11struct zero_initialised 11struct zero_initialised
12{ 12{
13 void *operator new (size_t s, void *);
13 void *operator new (size_t s); 14 void *operator new (size_t s);
14 void *operator new [] (size_t s); 15 void *operator new [] (size_t s);
15 void operator delete (void *p, size_t s); 16 void operator delete (void *p, size_t s);
16 void operator delete [] (void *p, size_t s); 17 void operator delete [] (void *p, size_t s);
18};
19
20struct refcounted
21{
22 mutable int refcnt;
23 refcounted () : refcnt (0) { }
24 void refcnt_inc () { ++refcnt; }
25 void refcnt_dec () { --refcnt;
26 if (refcnt < 0)abort();}//D
27};
28
29template<class T>
30struct refptr
31{
32 T *p;
33
34 refptr () : p(0) { }
35 refptr (const refptr<T> &p) : p(p.p) { if (p) p->refcnt_inc (); }
36 refptr (T *p) : p(p) { if (p) p->refcnt_inc (); }
37 ~refptr () { if (p) p->refcnt_dec (); }
38
39 const refptr<T> &operator =(T *o)
40 {
41 if (p) p->refcnt_dec ();
42 p = o;
43 if (p) p->refcnt_inc ();
44
45 return *this;
46 }
47
48 const refptr<T> &operator =(const refptr<T> o)
49 {
50 *this = o.p;
51 return *this;
52 }
53
54 T &operator * () const { return *p; }
55 T *operator ->() const { return p; }
56
57 operator T *() const { return p; }
17}; 58};
18 59
19struct str_hash 60struct str_hash
20{ 61{
21 std::size_t operator ()(const char *s) const 62 std::size_t operator ()(const char *s) const
48 { 89 {
49 return !strcmp (a, b); 90 return !strcmp (a, b);
50 } 91 }
51}; 92};
52 93
94#include <vector>
95
96template<class obj>
97struct unordered_vector : std::vector<obj>
98{
99 typedef typename std::vector<obj>::iterator iterator;
100
101 void erase (unsigned int pos)
102 {
103 if (pos < this->size () - 1)
104 (*this)[pos] = (*this)[this->size () - 1];
105
106 this->pop_back ();
107 }
108
109 void erase (iterator i)
110 {
111 erase ((unsigned int )(i - this->begin ()));
112 }
113};
114
115template<typename T, typename U> static inline T min (T a, U b) { return a < (T)b ? a : (T)b; }
116template<typename T, typename U> static inline T max (T a, U b) { return a > (T)b ? a : (T)b; }
117template<typename T, typename U, typename V> static inline T clamp (T v, U a, V b) { return v < (T)a ? a : v >(T)b ? b : v; }
118
119template<typename T, typename U> static inline void swap (T& a, U& b) { T t=a; a=(T)b; b=(U)t; }
120
121// basically does what strncpy should do
122template<int N>
123inline void assign (char (&dst)[N], const char *src)
124{
125 // should be optimised at some point, maybe should also add "..."
126 // when buffer is too small.
127 snprintf (dst, N, "%s", src);
128}
129
53#endif 130#endif
54 131

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines