2 (c) Han-Wen Nienhuys 1995,96,97
4 Distributed under GNU GPL
15 /// copy a bare (C-)array from #src# to #dest# sized #count#
16 template<class T> void arrcpy (T*dest, T*src, int count);
19 Scaleable array/stack template, for a type T with default constructor.
22 This template implements a scaleable vector. With (or without) range
23 checking. The type T should have a default constructor. It is
24 best suited for simple types, such as int, double or String, it
25 provides a paranoidly safe replacement for the new T[int] construct.
27 You should \bf{never} store pointers to objects in an Array (since
28 the array may be relocated without the pointer knowing it).
30 It uses stack terminology, (push, pop, top), and can be used as a stack.
38 /// maximum length of array.
44 /// stretch or shrink array.
45 void remax (int newmax)
47 T* newarr = new T[newmax];
48 size_ = (newmax < size_) ? newmax : size_;
49 arrcpy (newarr, array_p_, size_);
80 arrcpy (array_p_, tp, n);
84 { array_p_ = 0; max_ =0; size_ =0; }
86 // ugh, get around gcc 2.8.1 ice; see bezier.cc
94 /** set the size_ to #s#.
96 Warning: contents are unspecified */
99 if (s > max_) remax (s);
104 { delete[] array_p_; }
106 /// return a "new"ed copy of array
107 T* copy_array() const
109 T* Tarray = new T[size_];
110 arrcpy (Tarray, array_p_, size_);
114 T const *access_array () const
118 void operator=(Array const & src)
120 set_size (src.size_);
121 arrcpy (array_p_,src.array_p_, size_);
123 Array (Array const & src)
125 array_p_ = src.copy_array();
126 max_ = size_ = src.size_;
129 /// tighten array size_.
130 void tighten_maxsize() {
134 T * remove_array_p ();
137 T &operator[] (int i)
142 T const & operator[] (int i) const
147 T &elem_ref (int i) const
149 assert (i >=0&&i<size_);
150 return ((T*)array_p_)[i];
158 /// add to the end of array
164 // T::operator=(T &) is called here. Safe to use with automatic
166 array_p_[size_++] = x;
168 /// remove and return last entry
176 /// access last entry
179 return (*this)[size_-j-1];
181 /// return last entry
182 T top (int j=0) const
184 return (*this)[size_-j-1];
188 void swap (int i,int j)
191 (*this)[i]=(*this)[j];
197 void insert (T k, int j);
199 remove i-th element, and return it.
207 void unordered_del (int i)
209 elem_ref (i) = top();
210 set_size (size() -1);
214 assert (i >=0&& i < size_);
215 arrcpy (array_p_+i, array_p_+i+1, size_-i-1);
219 void sort (int (*compare)(T const&,T const&),
220 int lower = -1, int upper = -1);
221 void concat (Array<T> const &src)
224 set_size (size_ + src.size_);
225 arrcpy (array_p_+s,src.array_p_, src.size_);
227 Array<T> slice (int lower, int upper) ;