… | |
… | |
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); |
17 | }; |
18 | }; |
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; } |
|
|
58 | }; |
|
|
59 | |
|
|
60 | struct str_hash |
|
|
61 | { |
|
|
62 | std::size_t operator ()(const char *s) const |
|
|
63 | { |
|
|
64 | unsigned long hash = 0; |
|
|
65 | |
|
|
66 | /* use the one-at-a-time hash function, which supposedly is |
|
|
67 | * better than the djb2-like one used by perl5.005, but |
|
|
68 | * certainly is better then the bug used here before. |
|
|
69 | * see http://burtleburtle.net/bob/hash/doobs.html |
|
|
70 | */ |
|
|
71 | while (*s) |
|
|
72 | { |
|
|
73 | hash += *s++; |
|
|
74 | hash += hash << 10; |
|
|
75 | hash ^= hash >> 6; |
|
|
76 | } |
|
|
77 | |
|
|
78 | hash += hash << 3; |
|
|
79 | hash ^= hash >> 11; |
|
|
80 | hash += hash << 15; |
|
|
81 | |
|
|
82 | return hash; |
|
|
83 | } |
|
|
84 | }; |
|
|
85 | |
|
|
86 | struct str_equal |
|
|
87 | { |
|
|
88 | bool operator ()(const char *a, const char *b) const |
|
|
89 | { |
|
|
90 | return !strcmp (a, b); |
|
|
91 | } |
|
|
92 | }; |
|
|
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 | |
19 | #endif |
115 | #endif |
20 | |
116 | |