Changes having to due with my new 2-pass function relocator code.
[dyninst.git] / pdutil / h / Vector.h
1 /*
2  * Copyright (c) 1996 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 /************************************************************************
43  * Vector.h: resizable vectors.
44 ************************************************************************/
45
46
47 \f
48
49
50 #if !defined(_Vector_h_)
51 #define _Vector_h_
52
53 #if defined(external_templates)
54 #pragma interface
55 #endif
56
57 \f
58
59 /************************************************************************
60  * header files.
61 ************************************************************************/
62
63 #include <assert.h>
64 #include <stdlib.h>
65
66
67 \f
68
69 /************************************************************************
70  * template<class T> class Vector
71 ************************************************************************/
72
73 #if !defined(DO_INLINE_P)
74 #define DO_INLINE_P
75 #endif
76
77 #if !defined(DO_INLINE_F)
78 #define DO_INLINE_F
79 #endif
80
81 template<class T>
82 class vector {
83 public:
84     DO_INLINE_F vector (unsigned =0);
85     DO_INLINE_F vector (unsigned, const T &);
86     DO_INLINE_F vector (const vector<T> &);
87     DO_INLINE_F ~vector ();
88
89     DO_INLINE_F vector<T>&  operator= (const vector<T> &);
90     DO_INLINE_F vector<T>& operator+= (const vector<T> &);
91     DO_INLINE_F vector<T>& operator+= (const T &);
92
93     DO_INLINE_F T&         operator[] (unsigned)                               const;
94     DO_INLINE_F bool       operator== (const vector<T> &)                      const;
95     DO_INLINE_F unsigned         size ()                                       const;
96     DO_INLINE_F void           resize (unsigned);
97
98
99     DO_INLINE_F void             sort (int (*)(const void *, const void *));
100
101 private:
102     DO_INLINE_P void  create (unsigned);
103     DO_INLINE_P void    init (const T &);
104     DO_INLINE_P void    copy (unsigned, const T *);
105     DO_INLINE_P void destroy ();
106
107     T*       data_;
108     unsigned sz_;
109     unsigned tsz_;
110 };
111
112 template<class T>
113 DO_INLINE_F
114 vector<T>::vector(unsigned sz)
115     : data_(0), sz_(0), tsz_(0) {
116     create(sz);
117 }
118
119 template<class T>
120 DO_INLINE_F
121 vector<T>::vector(unsigned sz, const T& v0)
122     : data_(0), sz_(0), tsz_(0) {
123     create(sz);
124     init(v0);
125 }
126
127
128 template<class T>
129 DO_INLINE_F
130 vector<T>::vector(const vector<T>& v)
131     : data_(0), sz_(0), tsz_(0) {
132     create(v.sz_);
133     copy(v.sz_, v.data_);
134 }
135
136 template<class T>
137 DO_INLINE_F
138 vector<T>::~vector() {
139     destroy();
140 }
141
142 template<class T>
143 DO_INLINE_F
144 vector<T>&
145 vector<T>::operator=(const vector<T>& v) {
146     if (this == &v) {
147         return *this;
148     }
149     destroy();
150     create(v.sz_);
151     copy(v.sz_, v.data_);
152     return *this;
153 }
154
155 template<class T>
156 DO_INLINE_F
157 vector<T>&
158 vector<T>::operator+=(const vector<T>& v) {
159     unsigned osz = sz_;
160     resize(osz + v.sz_);
161     for (unsigned i = osz; i < sz_; ++i) {
162         data_[i] = v.data_[i-osz];
163     }
164     return *this;
165 }
166
167 template<class T>
168 DO_INLINE_F
169 vector<T>&
170 vector<T>::operator+=(const T& v0) {
171     resize(sz_+1);
172     data_[sz_-1] = v0;
173     return *this;
174 }
175
176 template<class T>
177 DO_INLINE_F
178 T&
179 vector<T>::operator[](unsigned i) const {
180     assert(i < sz_);
181     return data_[i];
182 }
183
184 template<class T>
185 DO_INLINE_F
186 bool
187 vector<T>::operator==(const vector<T>& v) const {
188     if (sz_ != v.sz_) {
189         return false;
190     }
191 // TODO
192 #if defined(notdef)
193     for (unsigned i = 0; i < sz_; i++) {
194         if (!(data_[i] == v.data_[i])) {
195             return false;
196         }
197     }
198 #endif
199     return true;
200 }
201
202 template<class T>
203 DO_INLINE_F
204 unsigned
205 vector<T>::size() const {
206     return sz_;
207 }
208
209 template<class T>
210 DO_INLINE_F
211 void
212 vector<T>::resize(unsigned sz) {
213     if (tsz_ == 0) {
214         create(sz);
215     }
216     else if (tsz_ >= sz) {
217         sz_ = sz;
218     }
219     else {
220         T*       odata = data_;
221         unsigned osz   = sz_;
222         unsigned nsz   = (((2*tsz_)>sz)?(2*tsz_):(sz));
223
224         data_ = new T[nsz];
225         tsz_  = nsz;
226         sz_   = sz;
227
228         for (unsigned i = 0; i < osz; ++i) {
229             data_[i] = odata[i];
230         }
231         delete[] odata;
232
233         sz_ = sz;
234     }
235 }
236
237 template<class T>
238 DO_INLINE_F
239 void
240 vector<T>::sort(int (*cmpfunc)(const void *, const void *)) {
241     qsort((void *) data_, sz_, sizeof(T), cmpfunc);
242 }
243
244 template<class T>
245 DO_INLINE_P
246 void
247 vector<T>::create(unsigned sz) {
248     if (sz > 0) {
249         data_ = new T[sz];
250     }
251     sz_ = tsz_ = sz;
252 }
253
254 template<class T>
255 DO_INLINE_P
256 void
257 vector<T>::init(const T& v0) {
258     for (unsigned i = 0; i < sz_; ++i) {
259         data_[i] = v0;
260     }
261 }
262
263 template<class T>
264 DO_INLINE_P
265 void
266 vector<T>::copy(unsigned sz, const T* data) {
267     for (unsigned i = 0; i < sz; ++i) {
268         data_[i] = data[i];
269     }
270 }
271
272 template<class T>
273 DO_INLINE_P
274 void
275 vector<T>::destroy() {
276     delete[] data_; data_ = 0;
277     sz_ = tsz_ = 0;
278 }
279
280 #endif /* !defined(_Vector_h_) */