… | |
… | |
8 | #endif |
8 | #endif |
9 | |
9 | |
10 | // makes dynamically allocated objects zero-initialised |
10 | // makes dynamically allocated objects zero-initialised |
11 | struct zero_initialised |
11 | struct 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 | |
|
|
20 | struct 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 | |
|
|
29 | template<class T> |
|
|
30 | struct 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 | |
19 | struct str_hash |
60 | struct 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 | |
|
|
96 | template<class obj> |
|
|
97 | struct 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 | |
|
|
115 | template<typename T, typename U> static inline T min (T a, U b) { return a < (T)b ? a : (T)b; } |
|
|
116 | template<typename T, typename U> static inline T max (T a, U b) { return a > (T)b ? a : (T)b; } |
|
|
117 | template<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 | |
|
|
119 | template<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, but appends "..." to strings exceeding length |
|
|
122 | void assign (char *dst, const char *src, int maxlen); |
|
|
123 | |
|
|
124 | // type-safe version of assign |
|
|
125 | template<int N> |
|
|
126 | inline void assign (char (&dst)[N], const char *src) |
|
|
127 | { |
|
|
128 | assign ((char *)&dst, src, N); |
|
|
129 | } |
|
|
130 | |
53 | #endif |
131 | #endif |
54 | |
132 | |