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_);
61 assert (max_ >= size_ && size_ >=0);
62 if (max_) assert (array_p_);
76 { array_p_ = 0; max_ =0; size_ =0; }
78 // ugh, get around gcc 2.8.1 ice; see bezier.cc
86 /** set the size_ to #s#.
88 Warning: contents are unspecified */
91 if (s >= max_) remax (s);
96 { delete[] array_p_; }
98 /// return a "new"ed copy of array
101 T* Tarray = new T[size_];
102 arrcpy (Tarray, array_p_, size_);
110 void operator=(Array const & src)
112 set_size (src.size_);
113 arrcpy (array_p_,src.array_p_, size_);
115 Array (Array const & src)
117 array_p_ = src.copy_array();
118 max_ = size_ = src.size_;
121 /// tighten array size_.
126 T * remove_array_p () {
135 T &operator[] (int i)
140 T const & operator[] (int i) const
145 T &elem (int i) const
147 assert (i >=0&&i<size_);
148 return ((T*)array_p_)[i];
151 /// add to the end of array
157 // T::operator=(T &) is called here. Safe to use with automatic
159 array_p_[size_++] = x;
161 /// remove and return last entry
169 /// access last entry
172 return (*this)[size_-j-1];
174 /// return last entry
175 T top (int j=0) const
177 return (*this)[size_-j-1];
181 void swap (int i,int j)
184 (*this)[i]=(*this)[j];
190 void insert (T k, int j);
192 remove i-th element, and return it.
200 void unordered_del (int i)
204 set_size (size() -1);
208 assert (i >=0&& i < size_);
209 arrcpy (array_p_+i, array_p_+i+1, size_-i-1);
213 void sort (int (*compare)(T const&,T const&),
214 int lower = -1, int upper = -1);
215 void concat (Array<T> const &src)
218 set_size (size_ + src.size_);
219 arrcpy (array_p_+s,src.array_p_, src.size_);
221 Array<T> slice (int lower, int upper)
223 assert (lower >= 0 && lower <=upper&& upper <= size_);
227 arrcpy (r.array_p_, array_p_ + lower, s);