Elm  1.0
ELM is a library providing generic data structures, OS-independent interface, plugins and XML.
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Vector.h
1 /*
2  * $Id$
3  * Vector class interface
4  *
5  * This file is part of OTAWA
6  * Copyright (c) 2004-08, IRIT UPS.
7  *
8  * OTAWA is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * OTAWA is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with OTAWA; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 #ifndef ELM_GENSTRUCT_VECTOR_H
23 #define ELM_GENSTRUCT_VECTOR_H
24 
25 #include <elm/assert.h>
26 #include <elm/genstruct/Table.h>
27 #include <elm/genstruct/Vector.h>
28 #include <elm/PreIterator.h>
29 
30 namespace elm { namespace genstruct {
31 
32 
33 // EmbedVector class
34 template <class T>
35 class Vector {
36 public:
37  inline Vector(int _cap = 8): tab(new T[_cap]), cap(_cap), cnt(0) { }
38  inline Vector(const Vector<T>& vec): tab(0), cap(0), cnt(0) { copy(vec); }
39  inline ~Vector(void) { if(tab) delete [] tab; }
40 
41  // Iterator
42  class Iterator: public PreIterator<Iterator, const T&> {
43  public:
44  friend class Vector;
45  inline Iterator(const Vector& vec): _vec(vec), i(0) { }
46  inline Iterator(const Iterator& iter): _vec(iter._vec), i(iter.i) { }
47  inline bool ended(void) const { return i >= _vec.length(); }
48  inline const T& item(void) const { return _vec[i]; }
49  inline void next(void) { i++; }
50  inline int index(void) { return i; }
51  const Vector<T>& vector(void) { return _vec; }
52  private:
53  const Vector<T>& _vec;
54  int i;
55  };
56 
57  // Accessors
58  int count(void) const { return cnt; }
59  inline int length(void) const { return count(); }
60  inline int capacity(void) const;
61  inline bool isEmpty(void) const { return cnt == 0; }
62  inline const T& get(int index) const;
63  inline T& item(int index);
64  inline void set(int index, const T value);
65  inline T& operator[](int index) { return item(index); }
66  inline const T& operator[](int index) const { return get(index); }
67  bool contains(const T& value) const;
68  template <template <class _> class C> inline bool containsAll(const C<T>& items)
69  { for(typename C<T>::Iterator item(items); item; item++)
70  if(!contains(item)) return false; return true; }
71  int indexOf(const T& value, int start = 0) const;
72  int lastIndexOf(const T& value, int start = -1) const;
73  inline operator bool(void) const { return cnt != 0; }
74  inline bool operator==(const Vector<T>& v) const
75  { if(length() != v.length()) return false; for(int i = 0; i < length(); i++) if(get(i) != v[i]) return false; return true; }
76  inline bool operator!=(const Vector<T>& v) const { return !(*this == v); }
77  inline const T& first(void) const
78  { ASSERT(cnt > 0); return tab[0]; }
79  inline const T& last(void) const
80  { ASSERT(cnt > 0); return tab[cnt - 1]; }
81  inline Iterator find(const T &item)
82  { Iterator i(*this); while(i && *i != item) i++; return i; }
83  inline Iterator find (const T &item, const Iterator &start)
84  { Iterator i(start); while(i && *i != item) i++; return i; }
85  inline const T& top(void) const
86  { ASSERTP(cnt > 0, "no more data in the stack"); return tab[cnt - 1]; }
87 
88  // Mutators
89  inline void add(void);
90  inline void add(const T& value);
91  template <template <class _> class C> inline void addAll(const C<T>& items)
92  { for(typename C<T>::Iterator item(items); item; item++) add(item); }
93  void removeAt(int index);
94  inline void remove(const T& value) { int i = indexOf(value); if(i >= 0) removeAt(i); }
95  inline void remove(const Iterator& iter) { removeAt(iter.i); }
96  template <template <class _> class C> inline void removeAll(const C<T>& items)
97  { for(typename C<T>::Iterator item(items); item; item++) remove(item); }
98  void insert(int index, const T& value);
99  inline void clear(void) { cnt = 0; }
100  void grow(int new_cap);
101  void setLength(int new_length);
102  inline table<T> detach(void);
103  inline void copy(const Vector& vec);
104  inline Vector<T>& operator=(const Vector& vec) { copy(vec); return *this; };
105  inline void swallow(Vector<T>& v) { if(tab) delete [] tab; tab = v.tab; v.tab = 0; }
106  inline void insert(const T &item) { add(item); }
107  inline void push(const T& value)
108  { add(value); }
109  inline const T pop(void)
110  { ASSERTP(cnt > 0, "no more data to pop"); return tab[--cnt]; }
111  inline void addFirst(const T &item) { insert(0, item); }
112  inline void addLast(const T &item) { add(item); }
113  inline void removeFirst(void) { removeAt(0); }
114  inline void removeLast(void) { removeAt(cnt - 1); }
115  inline void set (const Iterator &pos, const T &item) { tab[pos.pos] = item; }
116  inline void addAfter(const Iterator &pos, const T &item) { insert(pos.i + 1, item); }
117  inline void addBefore(const Iterator &pos, const T &item) { insert(pos.i, item); }
118 
119 private:
120  T *tab;
121  unsigned short cap, cnt;
122 };
123 
124 
125 // EmbedVector methods
126 
127 
128 
129 
130 template <class T>
132  T *dtab = tab;
133  tab = 0;
134  return table<T>(dtab, cnt);
135 }
136 
137 template <class T> int Vector<T>::capacity(void) const {
138  return cap;
139 }
140 template <class T> T& Vector<T>::item(int index) {
141  ASSERTP(index < cnt, "index out of bounds");
142  return tab[index];
143 }
144 template <class T> const T& Vector<T>::get(int index) const {
145  ASSERTP(index < cnt, "index out of bounds");
146  return tab[index];
147 }
148 template <class T> void Vector<T>::set(int index, const T value) {
149  ASSERTP(index < cnt, "index out of bounds");
150  tab[index] = value;
151 }
152 template <class T> bool Vector<T>::contains(const T& value) const {
153  for(int i = 0; i < cnt; i++)
154  if(value == tab[i])
155  return true;
156  return false;
157 }
158 template <class T> int Vector<T>::indexOf(const T& value, int start) const {
159  for(int i = start; i < cnt; i++)
160  if(value == tab[i])
161  return i;
162  return -1;
163 }
164 template <class T> int Vector<T>::lastIndexOf(const T& value, int start) const {
165  ASSERTP(start <= cnt, "index out of bounds");
166  for(int i = (start < 0 ? cnt : start) - 1; i >= 0; i--)
167  if(value == tab[i])
168  return i;
169  return -1;
170 }
171 
172 template <class T> void Vector<T>::add(const T& value) {
173  if(cnt >= cap)
174  grow(cap * 2);
175  tab[cnt++] = value;
176 }
177 
178 template <class T>
179 inline void Vector<T>::add(void) {
180  if(cnt >= cap)
181  grow(cap * 2);
182  cnt++;
183 }
184 
185 template <class T> void Vector<T>::removeAt(int index) {
186  for(int i = index + 1; i < cnt; i++)
187  tab[i - 1] = tab[i];
188  cnt--;
189 }
190 template <class T> void Vector<T>::insert(int index, const T& value) {
191  ASSERTP(index <= cnt, "index out of bounds");
192  if(cnt >= cap)
193  grow(cap * 2);
194  for(int i = cnt; i > index; i--)
195  tab[i] = tab[i - 1];
196  tab[index] = value;
197  cnt++;
198 }
199 template <class T> void Vector<T>::grow(int new_cap) {
200  ASSERTP(new_cap > 0 && new_cap < 65536, "new capacity out of [1, 65535]");
201  ASSERTP(new_cap >= cap, "new capacity must be bigger than old one");
202  cap = new_cap;
203  T *new_tab = new T[cap];
204  for(int i =0; i < cnt; i++)
205  new_tab[i] = tab[i];
206  delete [] tab;
207  tab = new_tab;
208 }
209 template <class T> void Vector<T>::setLength(int new_length) {
210  int new_cap;
211  ASSERTP(new_length >= 0, "new length must be >= 0");
212 
213  for (new_cap = 1; new_cap < new_length; new_cap *= 2);
214  if (new_cap > cap) {
215  grow(new_cap);
216  }
217  cnt = new_length;
218 }
219 
220 template <class T> inline void Vector<T>::copy(const Vector& vec) {
221  if(!tab || vec.cnt > cap) {
222  if(tab)
223  delete [] tab;
224  cap = vec.cap;
225  tab = new T[vec.cap];
226  }
227  cnt = vec.cnt;
228  for(int i = 0; i < cnt; i++)
229  tab[i] = vec.tab[i];
230 }
231 
232 } } // elm::genstruct
233 
234 #endif // ELM_GENSTRUCT_VECTOR_H
void set(const Iterator &pos, const T &item)
Definition: Vector.h:115
table< T > detach(void)
Definition: Vector.h:131
void addLast(const T &item)
Definition: Vector.h:112
Definition: Vector.h:42
Definition: PreIterator.h:29
void clear(void)
Definition: Vector.h:99
int indexOf(const T &value, int start=0) const
Definition: Vector.h:158
void insert(const T &item)
Definition: Vector.h:106
const T & top(void) const
Definition: Vector.h:85
const T & get(int index) const
Definition: Vector.h:144
bool operator!=(const Vector< T > &v) const
Definition: Vector.h:76
T & operator[](int index)
Definition: Vector.h:65
const T pop(void)
Definition: Vector.h:109
void addBefore(const Iterator &pos, const T &item)
Definition: Vector.h:117
void removeAll(const C< T > &items)
Definition: Vector.h:96
const T & last(void) const
Definition: Vector.h:79
Vector(int _cap=8)
Definition: Vector.h:37
const T & operator[](int index) const
Definition: Vector.h:66
void addFirst(const T &item)
Definition: Vector.h:111
T & item(int index)
Definition: Vector.h:140
Vector< T > & operator=(const Vector &vec)
Definition: Vector.h:104
bool ended(void) const
Definition: Vector.h:47
Definition: Table.h:130
void addAll(const C< T > &items)
Definition: Vector.h:91
void copy(const Vector &vec)
Definition: Vector.h:220
Iterator(const Iterator &iter)
Definition: Vector.h:46
value_t value(CString name, int value)
Definition: rtti.h:40
Iterator find(const T &item)
Definition: Vector.h:81
void swallow(Vector< T > &v)
Definition: Vector.h:105
const T & first(void) const
Definition: Vector.h:77
int lastIndexOf(const T &value, int start=-1) const
Definition: Vector.h:164
void removeLast(void)
Definition: Vector.h:114
int length(void) const
Definition: Vector.h:59
const T & item(void) const
Definition: Vector.h:48
const Vector< T > & vector(void)
Definition: Vector.h:51
void add(void)
Definition: Vector.h:179
Iterator find(const T &item, const Iterator &start)
Definition: Vector.h:83
void set(int index, const T value)
Definition: Vector.h:148
int capacity(void) const
Definition: Vector.h:137
~Vector(void)
Definition: Vector.h:39
bool containsAll(const C< T > &items)
Definition: Vector.h:68
bool operator==(const Vector< T > &v) const
Definition: Vector.h:74
void insert(int index, const T &value)
Definition: Vector.h:190
void removeFirst(void)
Definition: Vector.h:113
void push(const T &value)
Definition: Vector.h:107
bool isEmpty(void) const
Definition: Vector.h:61
Vector(const Vector< T > &vec)
Definition: Vector.h:38
Definition: Vector.h:35
void grow(int new_cap)
Definition: Vector.h:199
bool contains(const T &value) const
Definition: Vector.h:152
void setLength(int new_length)
Definition: Vector.h:209
void addAfter(const Iterator &pos, const T &item)
Definition: Vector.h:116
void removeAt(int index)
Definition: Vector.h:185
Iterator(const Vector &vec)
Definition: Vector.h:45
int count(void) const
Definition: Vector.h:58
int index(void)
Definition: Vector.h:50
void next(void)
Definition: Vector.h:49