1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>LCOV - lcov.info - /usr/include/xapian/base.h</title>
<link rel="stylesheet" type="text/css" href="../../../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
<tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td class="headerItem" width="20%">Current view:</td>
<td class="headerValue" width="80%" colspan=4><a href="../../../index.html">directory</a> - <a href="index.html">usr/include/xapian</a> - base.h</td>
</tr>
<tr>
<td class="headerItem" width="20%">Test:</td>
<td class="headerValue" width="80%" colspan=4>lcov.info</td>
</tr>
<tr>
<td class="headerItem" width="20%">Date:</td>
<td class="headerValue" width="20%">2008-08-14</td>
<td width="20%"></td>
<td class="headerItem" width="20%">Instrumented lines:</td>
<td class="headerValue" width="20%">11</td>
</tr>
<tr>
<td class="headerItem" width="20%">Code covered:</td>
<td class="headerValue" width="20%">45.5 %</td>
<td width="20%"></td>
<td class="headerItem" width="20%">Executed lines:</td>
<td class="headerValue" width="20%">5</td>
</tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td><br></td>
</tr>
<tr>
<td><pre class="source">
<span class="lineNum"> 1 </span> : /* base.h: Reference-counted pointers
<span class="lineNum"> 2 </span> : *
<span class="lineNum"> 3 </span> : * Copyright 1999,2000,2001 BrightStation PLC
<span class="lineNum"> 4 </span> : * Copyright 2002 Ananova Ltd
<span class="lineNum"> 5 </span> : * Copyright 2002,2003,2004,2007 Olly Betts
<span class="lineNum"> 6 </span> : *
<span class="lineNum"> 7 </span> : * This program is free software; you can redistribute it and/or
<span class="lineNum"> 8 </span> : * modify it under the terms of the GNU General Public License as
<span class="lineNum"> 9 </span> : * published by the Free Software Foundation; either version 2 of the
<span class="lineNum"> 10 </span> : * License, or (at your option) any later version.
<span class="lineNum"> 11 </span> : *
<span class="lineNum"> 12 </span> : * This program is distributed in the hope that it will be useful,
<span class="lineNum"> 13 </span> : * but WITHOUT ANY WARRANTY; without even the implied warranty of
<span class="lineNum"> 14 </span> : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
<span class="lineNum"> 15 </span> : * GNU General Public License for more details.
<span class="lineNum"> 16 </span> : *
<span class="lineNum"> 17 </span> : * You should have received a copy of the GNU General Public License
<span class="lineNum"> 18 </span> : * along with this program; if not, write to the Free Software
<span class="lineNum"> 19 </span> : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
<span class="lineNum"> 20 </span> : * USA
<span class="lineNum"> 21 </span> : */
<span class="lineNum"> 22 </span> :
<span class="lineNum"> 23 </span> : #ifndef XAPIAN_INCLUDED_BASE_H
<span class="lineNum"> 24 </span> : #define XAPIAN_INCLUDED_BASE_H
<span class="lineNum"> 25 </span> :
<span class="lineNum"> 26 </span> : #include <xapian/deprecated.h>
<span class="lineNum"> 27 </span> :
<span class="lineNum"> 28 </span> : namespace Xapian {
<span class="lineNum"> 29 </span> : namespace Internal {
<span class="lineNum"> 30 </span> :
<span class="lineNum"> 31 </span> : /** @internal Reference counted internal classes should inherit from RefCntBase.
<span class="lineNum"> 32 </span> : *
<span class="lineNum"> 33 </span> : * This gives the object a reference count used by RefCntPtr.
<span class="lineNum"> 34 </span> : */
<span class="lineNum"> 35 </span> : class RefCntBase {
<span class="lineNum"> 36 </span> : /* Note: We never delete a pointer to a subclass of RefCntBase using
<span class="lineNum"> 37 </span> : * a RefCntBase *, so we don't need a virtual destructor here.
<span class="lineNum"> 38 </span> : */
<span class="lineNum"> 39 </span> : protected:
<span class="lineNum"> 40 </span> : /** The copy constructor.
<span class="lineNum"> 41 </span> : *
<span class="lineNum"> 42 </span> : * This is protected since it'll only be used by derived classes,
<span class="lineNum"> 43 </span> : * which should only rarely need copying (this is, after all, a
<span class="lineNum"> 44 </span> : * refcount implementation). Sometimes it's needed, though,
<span class="lineNum"> 45 </span> : * since we need to zero ref_count in the copy.
<span class="lineNum"> 46 </span> : */
<span class="lineNum"> 47 </span> : RefCntBase(const RefCntBase &) : ref_count(0) { }
<span class="lineNum"> 48 </span> :
<span class="lineNum"> 49 </span> : public:
<span class="lineNum"> 50 </span> : /// The constructor, which initialises the ref_count to 0.
<span class="lineNum"> 51 </span> : RefCntBase() : ref_count(0) { }
<span class="lineNum"> 52 </span> :
<span class="lineNum"> 53 </span> : typedef unsigned int ref_count_t;
<span class="lineNum"> 54 </span> :
<span class="lineNum"> 55 </span> : /** The actual reference count. It's mutable so we can have reference
<span class="lineNum"> 56 </span> : * counting work with const pointers.
<span class="lineNum"> 57 </span> : */
<span class="lineNum"> 58 </span> : mutable ref_count_t ref_count;
<span class="lineNum"> 59 </span> : };
<span class="lineNum"> 60 </span> :
<span class="lineNum"> 61 </span> : /** @internal A reference-counted pointer. Can be used with any
<span class="lineNum"> 62 </span> : * class derived from RefCntBase, as long as it is allocated
<span class="lineNum"> 63 </span> : * on the heap by new (not new[]!).
<span class="lineNum"> 64 </span> : */
<span class="lineNum"> 65 </span> : template <class T>
<span class="lineNum"> 66 </span> : class RefCntPtr {
<span class="lineNum"> 67 </span> : private:
<span class="lineNum"> 68 </span> : T *dest;
<span class="lineNum"> 69 </span> :
<span class="lineNum"> 70 </span> : public:
<span class="lineNum"> 71 </span> : T *operator->() const;
<span class="lineNum"> 72 </span> : T &operator*() const;
<span class="lineNum"> 73 </span> : T *get() const;
<span class="lineNum"> 74 </span> : /** Make a RefCntPtr for an object which may already
<span class="lineNum"> 75 </span> : * have reference counted pointers.
<span class="lineNum"> 76 </span> : *
<span class="lineNum"> 77 </span> : * You usually pass in a newly created object, or an object may pass
<span class="lineNum"> 78 </span> : * in "this" to get a RefCntPtr to itself to pass to other classes.
<span class="lineNum"> 79 </span> : * (e.g. a database might pass a newly created postlist a reference
<span class="lineNum"> 80 </span> : * counted pointer to itself.)
<span class="lineNum"> 81 </span> : */
<span class="lineNum"> 82 </span> : RefCntPtr(T *dest_);
<span class="lineNum"> 83 </span> : RefCntPtr();
<span class="lineNum"> 84 </span> : RefCntPtr(const RefCntPtr &other);
<span class="lineNum"> 85 </span> : void operator=(const RefCntPtr &other);
<span class="lineNum"> 86 </span> : void operator=(T *dest_);
<span class="lineNum"> 87 </span> : ~RefCntPtr();
<span class="lineNum"> 88 </span> :
<span class="lineNum"> 89 </span> : template <class U>
<span class="lineNum"> 90 </span> : RefCntPtr(const RefCntPtr<U> &other);
<span class="lineNum"> 91 </span> : };
<span class="lineNum"> 92 </span> :
<span class="lineNum"> 93 </span> : template <class T>
<span class="lineNum"> 94 </span><span class="lineCov"> 19 : inline RefCntPtr<T>::RefCntPtr(T *dest_) : dest(dest_)</span>
<span class="lineNum"> 95 </span> : {
<span class="lineNum"> 96 </span><span class="lineCov"> 19 : if (dest) ++dest->ref_count;</span>
<span class="lineNum"> 97 </span><span class="lineCov"> 19 : }</span>
<span class="lineNum"> 98 </span> :
<span class="lineNum"> 99 </span> : template <class T>
<span class="lineNum"> 100 </span> : inline RefCntPtr<T>::RefCntPtr() : dest(0)
<span class="lineNum"> 101 </span> : {
<span class="lineNum"> 102 </span> : }
<span class="lineNum"> 103 </span> :
<span class="lineNum"> 104 </span> : template <class T>
<span class="lineNum"> 105 </span> : inline RefCntPtr<T>::RefCntPtr(const RefCntPtr &other) : dest(other.dest)
<span class="lineNum"> 106 </span> : {
<span class="lineNum"> 107 </span> : if (dest) ++dest->ref_count;
<span class="lineNum"> 108 </span> : }
<span class="lineNum"> 109 </span> :
<span class="lineNum"> 110 </span> : template <class T>
<span class="lineNum"> 111 </span> : inline void RefCntPtr<T>::operator=(const RefCntPtr &other) {
<span class="lineNum"> 112 </span> : operator=(other.dest);
<span class="lineNum"> 113 </span> : }
<span class="lineNum"> 114 </span> :
<span class="lineNum"> 115 </span> : template <class T>
<span class="lineNum"> 116 </span> : inline void RefCntPtr<T>::operator=(T *dest_) {
<span class="lineNum"> 117 </span> : // check if we're assigning a pointer to itself
<span class="lineNum"> 118 </span> : if (dest == dest_) return;
<span class="lineNum"> 119 </span> :
<span class="lineNum"> 120 </span> : // copy the new dest in before we delete the old to avoid a small
<span class="lineNum"> 121 </span> : // window in which dest points to a deleted object
<span class="lineNum"> 122 </span> : // FIXME: if pointer assignment isn't atomic, we ought to use locking...
<span class="lineNum"> 123 </span> : T *old_dest = dest;
<span class="lineNum"> 124 </span> : dest = dest_;
<span class="lineNum"> 125 </span> : if (dest) ++dest->ref_count;
<span class="lineNum"> 126 </span> : if (old_dest && --old_dest->ref_count == 0) delete old_dest;
<span class="lineNum"> 127 </span> : }
<span class="lineNum"> 128 </span> :
<span class="lineNum"> 129 </span> : template <class T>
<span class="lineNum"> 130 </span><span class="lineNoCov"> 0 : inline RefCntPtr<T>::~RefCntPtr()</span>
<span class="lineNum"> 131 </span> : {
<span class="lineNum"> 132 </span><span class="lineNoCov"> 0 : if (dest && --dest->ref_count == 0) {</span>
<span class="lineNum"> 133 </span> : // zero before we delete to avoid a small window in which dest points
<span class="lineNum"> 134 </span> : // to a deleted object
<span class="lineNum"> 135 </span> : // FIXME: if pointer assignment isn't atomic, we ought to use locking...
<span class="lineNum"> 136 </span><span class="lineNoCov"> 0 : T * condemned = dest;</span>
<span class="lineNum"> 137 </span><span class="lineNoCov"> 0 : dest = 0;</span>
<span class="lineNum"> 138 </span><span class="lineNoCov"> 0 : delete condemned;</span>
<span class="lineNum"> 139 </span> : }
<span class="lineNum"> 140 </span><span class="lineNoCov"> 0 : }</span>
<span class="lineNum"> 141 </span> :
<span class="lineNum"> 142 </span> : template <class T>
<span class="lineNum"> 143 </span> : template <class U>
<span class="lineNum"> 144 </span> : inline
<span class="lineNum"> 145 </span> : RefCntPtr<T>::RefCntPtr(const RefCntPtr<U> &other)
<span class="lineNum"> 146 </span> : : dest(other.get())
<span class="lineNum"> 147 </span> : {
<span class="lineNum"> 148 </span> : if (dest) ++dest->ref_count;
<span class="lineNum"> 149 </span> : }
<span class="lineNum"> 150 </span> :
<span class="lineNum"> 151 </span> : template <class T>
<span class="lineNum"> 152 </span> : inline T *RefCntPtr<T>::operator->() const
<span class="lineNum"> 153 </span> : {
<span class="lineNum"> 154 </span> : return dest;
<span class="lineNum"> 155 </span> : }
<span class="lineNum"> 156 </span> :
<span class="lineNum"> 157 </span> : template <class T>
<span class="lineNum"> 158 </span> : inline T &RefCntPtr<T>::operator*() const
<span class="lineNum"> 159 </span> : {
<span class="lineNum"> 160 </span> : return *dest;
<span class="lineNum"> 161 </span> : }
<span class="lineNum"> 162 </span> :
<span class="lineNum"> 163 </span> : template <class T>
<span class="lineNum"> 164 </span><span class="lineCov"> 30 : inline T *RefCntPtr<T>::get() const</span>
<span class="lineNum"> 165 </span> : {
<span class="lineNum"> 166 </span><span class="lineCov"> 30 : return dest;</span>
<span class="lineNum"> 167 </span> : }
<span class="lineNum"> 168 </span> :
<span class="lineNum"> 169 </span> : }
<span class="lineNum"> 170 </span> : }
<span class="lineNum"> 171 </span> :
<span class="lineNum"> 172 </span> : #endif /* XAPIAN_INCLUDED_BASE_H */
</pre>
</td>
</tr>
</table>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
</table>
<br>
</body>
</html>
|