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 void operator=(Array const & src)
116 set_size (src.size_);
117 arrcpy (array_p_,src.array_p_, size_);
119 Array (Array const & src)
121 array_p_ = src.copy_array();
122 max_ = size_ = src.size_;
125 /// tighten array size_.
130 T * remove_array_p ();
133 T &operator[] (int i)
138 T const & operator[] (int i) const
143 T &elem_ref (int i) const
145 assert (i >=0&&i<size_);
146 return ((T*)array_p_)[i];
154 /// add to the end of array
160 // T::operator=(T &) is called here. Safe to use with automatic
162 array_p_[size_++] = x;
164 /// remove and return last entry
172 /// access last entry
175 return (*this)[size_-j-1];
177 /// return last entry
178 T top (int j=0) const
180 return (*this)[size_-j-1];
184 void swap (int i,int j)
187 (*this)[i]=(*this)[j];
193 void insert (T k, int j);
195 remove i-th element, and return it.
203 void unordered_del (int i)
205 elem_ref (i) = top();
206 set_size (size() -1);
210 assert (i >=0&& i < size_);
211 arrcpy (array_p_+i, array_p_+i+1, size_-i-1);
215 void sort (int (*compare)(T const&,T const&),
216 int lower = -1, int upper = -1);
217 void concat (Array<T> const &src)
220 set_size (size_ + src.size_);
221 arrcpy (array_p_+s,src.array_p_, src.size_);
223 Array<T> slice (int lower, int upper) ;