ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvtutil.h
Revision: 1.46
Committed: Thu Jun 2 13:07:28 2011 UTC (12 years, 11 months ago) by sf-exg
Content type: text/plain
Branch: MAIN
CVS Tags: rel-9_14, rel-9_12
Changes since 1.45: +0 -1 lines
Log Message:
Remove unneeded includes.

File Contents

# User Rev Content
1 root 1.1 #ifndef RXVT_UTIL_H
2     #define RXVT_UTIL_H
3    
4 root 1.19 #include <cstdlib>
5 root 1.4 #include <cstring>
6 sf-exg 1.45 #include "ecb.h"
7 root 1.4
8 root 1.27 using namespace std;
9    
10 root 1.24 // increases code size unless -fno-enforce-eh-specs
11     #if __GNUC__
12     # define NOTHROW
13     # define THROW(x)
14     #else
15     # define NOTHROW throw()
16     # define THROW(x) throw x
17     #endif
18    
19 root 1.16 // various utility functions
20 root 1.13 template<typename T, typename U> static inline T min (T a, U b) { return a < (T)b ? a : (T)b; }
21     template<typename T, typename U> static inline void min_it (T &a, U b) { a = a < (T)b ? a : (T)b; }
22     template<typename T, typename U> static inline T max (T a, U b) { return a > (T)b ? a : (T)b; }
23     template<typename T, typename U> static inline void max_it (T &a, U b) { a = a > (T)b ? a : (T)b; }
24    
25     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; }
26     template<typename T, typename U, typename V> static inline void clamp_it (T &v, U a, V b) { v = v < (T)a ? a : v >(T)b ? b : v; }
27    
28 root 1.14 template<typename T, typename U> static inline void swap (T& a, U& b) { T t=a; a=(T)b; b=(U)t; }
29 root 1.8
30 root 1.25 template<typename T> static inline T squared_diff (T a, T b) { return (a-b)*(a-b); }
31    
32 root 1.21 // linear interpolation
33     template<typename T, typename U, typename P>
34     static inline
35     T lerp (T a, U b, P p)
36     {
37 root 1.26 return (long(a) * long(100 - p) + long(b) * long(p) + 50) / 100;
38 root 1.21 }
39    
40 ayin 1.32 template <typename I, typename T>
41     I find (I first, I last, const T& value)
42     {
43     while (first != last && *first != value)
44     ++first;
45    
46     return first;
47     }
48    
49     // return a very temporary (and never deallocated) buffer. keep small.
50     void *rxvt_temp_buf (int len);
51    
52     template<typename T>
53     static inline T *
54     rxvt_temp_buf (int len)
55     {
56     return (T *)rxvt_temp_buf (len * sizeof (T));
57     }
58    
59 root 1.11 // in range including end
60     #define IN_RANGE_INC(val,beg,end) \
61 root 1.9 ((unsigned int)(val) - (unsigned int)(beg) <= (unsigned int)(end) - (unsigned int)(beg))
62 root 1.1
63 root 1.11 // in range excluding end
64     #define IN_RANGE_EXC(val,beg,end) \
65     ((unsigned int)(val) - (unsigned int)(beg) < (unsigned int)(end) - (unsigned int)(beg))
66    
67 ayin 1.36 // for m >= -n, ensure remainder lies between 0..n-1
68     #define MOD(m,n) (((m) + (n)) % (n))
69    
70 root 1.16 // makes dynamically allocated objects zero-initialised
71 root 1.38 struct zero_initialized
72     {
73 root 1.4 void *operator new (size_t s);
74     void operator delete (void *p, size_t s);
75     };
76    
77     /* simplevec taken (and heavily modified), from:
78 ayin 1.29 *
79 root 1.4 * MICO --- a free CORBA implementation
80     * Copyright (C) 1997-98 Kay Roemer & Arno Puder
81     */
82     template<class T>
83 root 1.38 struct simplevec
84     {
85 root 1.4 typedef T* iterator;
86     typedef const T* const_iterator;
87     typedef unsigned long size_type;
88    
89     private:
90     size_type _last, _size;
91     T *_buf;
92    
93     public:
94     const_iterator begin () const
95     {
96 root 1.8 return &_buf[0];
97 root 1.4 }
98     iterator begin ()
99     {
100 root 1.8 return &_buf[0];
101 root 1.4 }
102     const_iterator end () const
103     {
104 root 1.8 return &_buf[_last];
105 root 1.4 }
106     iterator end ()
107     {
108 root 1.8 return &_buf[_last];
109 root 1.4 }
110     size_type capacity () const
111     {
112 root 1.8 return _size;
113 root 1.4 }
114     size_type size () const
115     {
116 root 1.8 return _last;
117 root 1.4 }
118    
119     private:
120     static T *alloc (size_type n)
121     {
122 root 1.8 return (T *)::operator new ((size_t) (n * sizeof (T)));
123 root 1.4 }
124     static void dealloc (T *buf)
125     {
126 root 1.8 if (buf)
127     ::operator delete (buf);
128 root 1.4 }
129    
130     void reserve (iterator where, size_type n)
131     {
132 root 1.8 if (_last + n <= _size) {
133     memmove (where+n, where, (end ()-where)*sizeof (T));
134     } else {
135     size_type sz = _last+n;
136     sz = (_size == 0) ? max (sz, 5) : max (sz, 2*_size);
137     T *nbuf = alloc (sz);
138     if (_buf) {
139     memcpy (nbuf, begin (), (where-begin ())*sizeof (T));
140     memcpy (nbuf + (where-begin ()) + n, where,
141     (end ()-where)*sizeof (T));
142     dealloc (_buf);
143     }
144     _buf = nbuf;
145     _size = sz;
146     }
147 root 1.4 }
148    
149     public:
150     void reserve (size_type sz)
151     {
152 root 1.8 if (_size < sz) {
153     sz = (_size == 0) ? max (sz, 5) : max (sz, 2*_size);
154     T *nbuf = alloc (sz);
155     if (_buf) {
156     memcpy (nbuf, begin (), size ()*sizeof (T));
157     dealloc (_buf);
158     }
159     _buf = nbuf;
160     _size = sz;
161     }
162 root 1.4 }
163     simplevec ()
164     : _last(0), _size(0), _buf(0)
165     {
166     }
167     simplevec (size_type n, const T& t = T ())
168     : _last(0), _size(0), _buf(0)
169     {
170 root 1.8 insert (begin (), n, t);
171 root 1.4 }
172     simplevec (const_iterator first, const_iterator last)
173     : _last(0), _size(0), _buf(0)
174     {
175 root 1.8 insert (begin (), first, last);
176 root 1.4 }
177     simplevec (const simplevec<T> &v)
178     : _last(0), _size(0), _buf(0)
179     {
180 root 1.8 reserve (v._last);
181     memcpy (_buf, v.begin (), v.size ()*sizeof (T));
182     _last = v._last;
183 root 1.4 }
184     simplevec<T> &operator= (const simplevec<T> &v)
185     {
186 root 1.8 if (this != &v) {
187     _last = 0;
188     reserve (v._last);
189     memcpy (_buf, v.begin (), v.size ()*sizeof (T));
190     _last = v._last;
191     }
192 root 1.4 return *this;
193     }
194     ~simplevec ()
195     {
196 root 1.8 dealloc (_buf);
197 root 1.4 }
198     const T &front () const
199     {
200 root 1.8 //ministl_assert (size () > 0);
201     return _buf[0];
202 root 1.4 }
203     T &front ()
204     {
205 root 1.8 //ministl_assert (size () > 0);
206     return _buf[0];
207 root 1.4 }
208     const T &back () const
209     {
210 root 1.8 //ministl_assert (size () > 0);
211     return _buf[_last-1];
212 root 1.4 }
213     T &back ()
214     {
215 root 1.8 //ministl_assert (size () > 0);
216     return _buf[_last-1];
217 root 1.4 }
218     bool empty () const
219     {
220 root 1.8 return _last == 0;
221 root 1.4 }
222     void clear ()
223     {
224 root 1.8 _last = 0;
225 root 1.4 }
226     void push_back (const T &t)
227     {
228 root 1.8 reserve (_last+1);
229     *end () = t;
230     ++_last;
231 root 1.4 }
232     void push_back (T &t)
233     {
234 root 1.8 reserve (_last+1);
235     *end () = t;
236     ++_last;
237 root 1.4 }
238     void pop_back ()
239     {
240 root 1.8 //ministl_assert (size () > 0);
241     --_last;
242 root 1.4 }
243     const T &operator[] (size_type idx) const
244     {
245 root 1.8 //ministl_assert (idx < size ());
246     return _buf[idx];
247 root 1.4 }
248     T &operator[] (size_type idx)
249     {
250 root 1.8 //ministl_assert (idx < size ());
251     return _buf[idx];
252 root 1.4 }
253     iterator insert (iterator pos, const T &t)
254     {
255 root 1.8 //ministl_assert (pos <= end ());
256     long at = pos - begin ();
257     reserve (pos, 1);
258     pos = begin ()+at;
259     *pos = t;
260     ++_last;
261     return pos;
262 root 1.4 }
263     iterator insert (iterator pos, const_iterator first, const_iterator last)
264     {
265     //ministl_assert (pos <= end ());
266 root 1.8 long n = last - first;
267     long at = pos - begin ();
268     if (n > 0) {
269     reserve (pos, n);
270     pos = begin ()+at;
271     memcpy (pos, first, (last-first)*sizeof (T));
272     _last += n;
273     }
274     return pos;
275 root 1.4 }
276     iterator insert (iterator pos, size_type n, const T &t)
277     {
278     //ministl_assert (pos <= end ());
279 root 1.8 long at = pos - begin ();
280     if (n > 0) {
281     reserve (pos, n);
282     pos = begin ()+at;
283     for (int i = 0; i < n; ++i)
284     pos[i] = t;
285     _last += n;
286     }
287     return pos;
288 root 1.4 }
289     void erase (iterator first, iterator last)
290     {
291 root 1.8 if (last != first) {
292 root 1.18 memmove (first, last, (end () - last) * sizeof (T));
293 root 1.8 _last -= last - first;
294     }
295 root 1.4 }
296     void erase (iterator pos)
297     {
298     if (pos != end ()) {
299 root 1.18 memmove (pos, pos+1, (end () - (pos+1)) * sizeof (T));
300 root 1.4 --_last;
301     }
302     }
303 root 1.8 void swap (simplevec<T> &t)
304     {
305     ::swap(_last, t._last);
306     ::swap(_size, t._size);
307     ::swap(_buf, t._buf);
308     }
309 root 1.4 };
310    
311     template<class T>
312     bool operator== (const simplevec<T> &v1, const simplevec<T> &v2)
313     {
314     if (v1.size () != v2.size ())
315 root 1.8 return false;
316 root 1.4 return !v1.size () || !memcmp (&v1[0], &v2[0], v1.size ()*sizeof (T));
317     }
318    
319     template<class T>
320     bool operator< (const simplevec<T> &v1, const simplevec<T> &v2)
321     {
322     unsigned long minlast = min (v1.size (), v2.size ());
323     for (unsigned long i = 0; i < minlast; ++i) {
324     if (v1[i] < v2[i])
325 root 1.8 return true;
326     if (v2[i] < v1[i])
327     return false;
328 root 1.4 }
329     return v1.size () < v2.size ();
330     }
331    
332 root 1.1
333     template<typename T>
334     struct vector : simplevec<T>
335 root 1.35 {
336     };
337 root 1.1
338 ayin 1.32 struct stringvec : simplevec<char *>
339     {
340     ~stringvec ()
341     {
342     for (char **c = begin (); c != end (); c++)
343     free (*c);
344     }
345     };
346    
347 root 1.34 #if 0
348 root 1.1 template<typename T>
349 root 1.38 struct rxvt_vec : simplevec<void *>
350     {
351 root 1.1 typedef T *iterator;
352    
353     void push_back (T d) { simplevec<void *>::push_back ((void *)d); }
354     T pop_back () { return (T*)simplevec<void *>::pop_back (); }
355     void erase (int i) { erase (begin () + i); }
356     void erase (iterator i) { simplevec<void *>::erase ((void **)i); }
357     iterator begin () const { return (iterator)simplevec<void *>::begin (); }
358     iterator end () const { return (iterator)simplevec<void *>::end (); }
359     T &operator [] (int i) { return * (T *) (& ((* (simplevec<void *> *)this)[i])); }
360     const T &operator [] (int i) const { return * (const T *) (& ((* (const simplevec<void *> *)this)[i])); }
361     };
362 root 1.34 #endif
363 root 1.1
364     template<typename T>
365 root 1.38 struct auto_ptr
366     {
367 root 1.1 T *p;
368    
369     auto_ptr () : p (0) { }
370     auto_ptr (T *a) : p (a) { }
371    
372     auto_ptr (auto_ptr<T> &a)
373     {
374     p = a.p;
375     a.p = 0;
376     }
377    
378     template<typename A>
379     auto_ptr (auto_ptr<A> &a)
380     {
381     p = a.p;
382     a.p = 0;
383     }
384    
385     ~auto_ptr ()
386     {
387     delete p;
388     }
389    
390     // void because it makes sense in our context
391     void operator = (T *a)
392     {
393     delete p;
394     p = a;
395     }
396    
397     void operator = (auto_ptr &a)
398     {
399     *this = a.p;
400     a.p = 0;
401     }
402    
403     template<typename A>
404     void operator = (auto_ptr<A> &a)
405     {
406     *this = a.p;
407     a.p = 0;
408     }
409    
410     operator T * () const { return p; }
411    
412     T *operator -> () const { return p; }
413     T &operator * () const { return *p; }
414    
415     T *get ()
416     {
417     T *r = p;
418     p = 0;
419     return r;
420     }
421     };
422    
423     typedef auto_ptr<char> auto_str;
424 root 1.20
425 root 1.1 #endif
426