1 #ifndef RXVT_UTIL_H
2 #define RXVT_UTIL_H
3 
4 #include <stdlib.h>
5 #include <string.h>
6 
7 #define ECB_NO_THREADS 1
8 #include "ecb.h"
9 
10 #include "estl.h"
11 
12 #include "emman.h"
13 
14 // various utility functions
min_it(T & a,U b)15 template<typename T, typename U> static inline void min_it (T &a, U b) { a = a < (T)b ? a : (T)b; }
max_it(T & a,U b)16 template<typename T, typename U> static inline void max_it (T &a, U b) { a = a > (T)b ? a : (T)b; }
17 
clamp(T v,U a,V b)18 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; }
clamp_it(T & v,U a,V b)19 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; }
20 
21 // linear interpolation
22 template<typename T, typename U, typename P>
23 static inline T
lerp(T a,U b,P p)24 lerp (T a, U b, P p)
25 {
26   return (long(a) * long(100 - p) + long(b) * long(p) + 50) / 100;
27 }
28 
29 // return a very temporary (and never deallocated) buffer. keep small.
30 void *rxvt_temp_buf (int len);
31 
32 template<typename T>
33 static inline T *
rxvt_temp_buf(int len)34 rxvt_temp_buf (int len)
35 {
36   return (T *)rxvt_temp_buf (len * sizeof (T));
37 }
38 
39 // in range including end
40 #define IN_RANGE_INC(val,beg,end) \
41   ((unsigned int)(val) - (unsigned int)(beg) <= (unsigned int)(end) - (unsigned int)(beg))
42 
43 // in range excluding end
44 #define IN_RANGE_EXC(val,beg,end) \
45   ((unsigned int)(val) - (unsigned int)(beg) <  (unsigned int)(end) - (unsigned int)(beg))
46 
47 // for m >= -n, ensure remainder lies between 0..n-1
48 #define MOD(m,n) (((m) + (n)) % (n))
49 
50 // makes dynamically allocated objects zero-initialised
51 struct zero_initialized
52 {
53   void *operator new (size_t s);
54   void operator delete (void *p, size_t s);
55 };
56 
57 struct stringvec : simplevec<char *>
58 {
~stringvecstringvec59   ~stringvec ()
60   {
61     for (char **c = begin (); c != end (); c++)
62       free (*c);
63   }
64 };
65 
66 #if 0
67 template<typename T>
68 struct rxvt_vec : simplevec<void *>
69 {
70   typedef T *iterator;
71 
72   void push_back (T d) { simplevec<void *>::push_back ((void *)d); }
73   T pop_back () { return (T*)simplevec<void *>::pop_back (); }
74   void erase (int i) { erase (begin () + i); }
75   void erase (iterator i) { simplevec<void *>::erase ((void **)i); }
76   iterator begin () const { return (iterator)simplevec<void *>::begin (); }
77   iterator end () const { return (iterator)simplevec<void *>::end (); }
78   T &operator [] (int i) { return * (T *) (& ((* (simplevec<void *> *)this)[i])); }
79   const T &operator [] (int i) const { return * (const T *) (& ((* (const simplevec<void *> *)this)[i])); }
80 };
81 #endif
82 
83 typedef estl::scoped_array<char> auto_str;
84 
85 #endif
86 
87