ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libptytty/src/estl.h
Revision: 1.2
Committed: Sat Jan 21 13:44:38 2012 UTC (12 years, 5 months ago) by sf-exg
Content type: text/plain
Branch: MAIN
Changes since 1.1: +5 -0 lines
Log Message:
Add include guard to estl.h.

File Contents

# User Rev Content
1 sf-exg 1.2 #ifndef ESTL_H
2     #define ESTL_H
3    
4 sf-exg 1.1 #include <stdlib.h>
5     #include <string.h>
6    
7     template<typename T, typename U> static inline T min (T a, U b) { return a < (T)b ? a : (T)b; }
8     template<typename T, typename U> static inline T max (T a, U b) { return a > (T)b ? a : (T)b; }
9    
10     template<typename T, typename U> static inline void swap (T& a, U& b) { T t=a; a=(T)b; b=(U)t; }
11    
12     template <typename I, typename T>
13     I find (I first, I last, const T& value)
14     {
15     while (first != last && *first != value)
16     ++first;
17    
18     return first;
19     }
20    
21     /* simplevec taken (and heavily modified), from:
22     *
23     * MICO --- a free CORBA implementation
24     * Copyright (C) 1997-98 Kay Roemer & Arno Puder
25     */
26     template<class T>
27     struct simplevec
28     {
29     typedef T* iterator;
30     typedef const T* const_iterator;
31     typedef unsigned long size_type;
32    
33     private:
34     size_type _last, _size;
35     T *_buf;
36    
37     public:
38     const_iterator begin () const
39     {
40     return &_buf[0];
41     }
42     iterator begin ()
43     {
44     return &_buf[0];
45     }
46     const_iterator end () const
47     {
48     return &_buf[_last];
49     }
50     iterator end ()
51     {
52     return &_buf[_last];
53     }
54     size_type capacity () const
55     {
56     return _size;
57     }
58     size_type size () const
59     {
60     return _last;
61     }
62    
63     private:
64     static T *alloc (size_type n)
65     {
66     return (T *)::operator new ((size_t) (n * sizeof (T)));
67     }
68     static void dealloc (T *buf)
69     {
70     if (buf)
71     ::operator delete (buf);
72     }
73    
74     void reserve (iterator where, size_type n)
75     {
76     if (_last + n <= _size) {
77     memmove (where+n, where, (end ()-where)*sizeof (T));
78     } else {
79     size_type sz = _last+n;
80     sz = (_size == 0) ? max (sz, 5) : max (sz, 2*_size);
81     T *nbuf = alloc (sz);
82     if (_buf) {
83     memcpy (nbuf, begin (), (where-begin ())*sizeof (T));
84     memcpy (nbuf + (where-begin ()) + n, where,
85     (end ()-where)*sizeof (T));
86     dealloc (_buf);
87     }
88     _buf = nbuf;
89     _size = sz;
90     }
91     }
92    
93     public:
94     void reserve (size_type sz)
95     {
96     if (_size < sz) {
97     sz = (_size == 0) ? max (sz, 5) : max (sz, 2*_size);
98     T *nbuf = alloc (sz);
99     if (_buf) {
100     memcpy (nbuf, begin (), size ()*sizeof (T));
101     dealloc (_buf);
102     }
103     _buf = nbuf;
104     _size = sz;
105     }
106     }
107     simplevec ()
108     : _last(0), _size(0), _buf(0)
109     {
110     }
111     simplevec (size_type n, const T& t = T ())
112     : _last(0), _size(0), _buf(0)
113     {
114     insert (begin (), n, t);
115     }
116     simplevec (const_iterator first, const_iterator last)
117     : _last(0), _size(0), _buf(0)
118     {
119     insert (begin (), first, last);
120     }
121     simplevec (const simplevec<T> &v)
122     : _last(0), _size(0), _buf(0)
123     {
124     reserve (v._last);
125     memcpy (_buf, v.begin (), v.size ()*sizeof (T));
126     _last = v._last;
127     }
128     simplevec<T> &operator= (const simplevec<T> &v)
129     {
130     if (this != &v) {
131     _last = 0;
132     reserve (v._last);
133     memcpy (_buf, v.begin (), v.size ()*sizeof (T));
134     _last = v._last;
135     }
136     return *this;
137     }
138     ~simplevec ()
139     {
140     dealloc (_buf);
141     }
142     const T &front () const
143     {
144     //ministl_assert (size () > 0);
145     return _buf[0];
146     }
147     T &front ()
148     {
149     //ministl_assert (size () > 0);
150     return _buf[0];
151     }
152     const T &back () const
153     {
154     //ministl_assert (size () > 0);
155     return _buf[_last-1];
156     }
157     T &back ()
158     {
159     //ministl_assert (size () > 0);
160     return _buf[_last-1];
161     }
162     bool empty () const
163     {
164     return _last == 0;
165     }
166     void clear ()
167     {
168     _last = 0;
169     }
170     void push_back (const T &t)
171     {
172     reserve (_last+1);
173     *end () = t;
174     ++_last;
175     }
176     void push_back (T &t)
177     {
178     reserve (_last+1);
179     *end () = t;
180     ++_last;
181     }
182     void pop_back ()
183     {
184     //ministl_assert (size () > 0);
185     --_last;
186     }
187     const T &operator[] (size_type idx) const
188     {
189     //ministl_assert (idx < size ());
190     return _buf[idx];
191     }
192     T &operator[] (size_type idx)
193     {
194     //ministl_assert (idx < size ());
195     return _buf[idx];
196     }
197     iterator insert (iterator pos, const T &t)
198     {
199     //ministl_assert (pos <= end ());
200     long at = pos - begin ();
201     reserve (pos, 1);
202     pos = begin ()+at;
203     *pos = t;
204     ++_last;
205     return pos;
206     }
207     iterator insert (iterator pos, const_iterator first, const_iterator last)
208     {
209     //ministl_assert (pos <= end ());
210     long n = last - first;
211     long at = pos - begin ();
212     if (n > 0) {
213     reserve (pos, n);
214     pos = begin ()+at;
215     memcpy (pos, first, (last-first)*sizeof (T));
216     _last += n;
217     }
218     return pos;
219     }
220     iterator insert (iterator pos, size_type n, const T &t)
221     {
222     //ministl_assert (pos <= end ());
223     long at = pos - begin ();
224     if (n > 0) {
225     reserve (pos, n);
226     pos = begin ()+at;
227     for (int i = 0; i < n; ++i)
228     pos[i] = t;
229     _last += n;
230     }
231     return pos;
232     }
233     void erase (iterator first, iterator last)
234     {
235     if (last != first) {
236     memmove (first, last, (end () - last) * sizeof (T));
237     _last -= last - first;
238     }
239     }
240     void erase (iterator pos)
241     {
242     if (pos != end ()) {
243     memmove (pos, pos+1, (end () - (pos+1)) * sizeof (T));
244     --_last;
245     }
246     }
247     void swap (simplevec<T> &t)
248     {
249     ::swap(_last, t._last);
250     ::swap(_size, t._size);
251     ::swap(_buf, t._buf);
252     }
253     };
254    
255     template<class T>
256     bool operator== (const simplevec<T> &v1, const simplevec<T> &v2)
257     {
258     if (v1.size () != v2.size ())
259     return false;
260     return !v1.size () || !memcmp (&v1[0], &v2[0], v1.size ()*sizeof (T));
261     }
262    
263     template<class T>
264     bool operator< (const simplevec<T> &v1, const simplevec<T> &v2)
265     {
266     unsigned long minlast = min (v1.size (), v2.size ());
267     for (unsigned long i = 0; i < minlast; ++i) {
268     if (v1[i] < v2[i])
269     return true;
270     if (v2[i] < v1[i])
271     return false;
272     }
273     return v1.size () < v2.size ();
274     }
275    
276     template<typename T>
277     struct vector : simplevec<T>
278     {
279     };
280 sf-exg 1.2
281     #endif