Elm  2
ELM is a library providing generic data structures, OS-independent interface, plugins and XML.
Array.h
1 /*
2  * Array classes interface
3  *
4  * This file is part of OTAWA
5  * Copyright (c) 2016, IRIT UPS.
6  *
7  * OTAWA is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * OTAWA is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with OTAWA; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 #ifndef ELM_ARRAY_TABLE_H_
22 #define ELM_ARRAY_TABLE_H_
23 
24 #include <elm/assert.h>
25 #include <elm/PreIterator.h>
26 #include <elm/array.h>
27 #include <elm/compare.h>
28 #include <elm/data/util.h>
29 
30 namespace elm {
31 
32 template <class T>
33 class Array {
34 public:
35  typedef T t;
36  typedef Array<T> self_t;
37 
38  inline Array(void): cnt(0), buf(0) { }
39  inline Array(int count, T *buffer): cnt(count), buf(buffer) { }
40 
41  inline const T *buffer(void) const { return buf; }
42  inline T *buffer(void) { return buf; }
43  inline int size(void) const { return count(); }
44  inline void set(int count, T *buffer) { cnt = count; buf = buffer; }
45  inline void set(const Array<T>& t) { cnt = t.cnt; buf = t.buf; }
46  inline void copy(const Array& t) { cnt = min(cnt, t.cnt); array::copy(buf, t.buf, cnt); }
47  inline void fill(const T& val) { array::set(buf, cnt, val); }
48  inline const T *operator()(void) const { return buffer(); }
49  inline T *operator()(void) { return buffer(); }
50  inline Array<T>& operator=(const Array<T>& t) { set(t); return *this; }
51 
52  class PreIter: public elm::PreIter<PreIter, T> {
53  friend class Array;
54  public:
55  inline PreIter(): p(0), t(0) { }
56  inline PreIter(const Array<T>& table): p(table.buffer()), t(table.buffer() + table.count()) { }
57  inline PreIter(const Array<T>& table, bool end): p(table.buffer() + (end ? table.count() : 0)), t(table.buffer() + table.count()) { }
58  inline bool ended(void) const { return p >= t; }
59  inline void next(void) { p++; }
60  inline bool equals(const PreIter& i) const { return p == i.p && t == i.t; }
61  protected:
62  const T *p, *t;
63  };
64 
65  class Iter: public PreIter, public ConstPreIter<Iter, T> {
66  public:
67  using PreIter::PreIter;
68  inline const T& item() const { ASSERT(PreIter::p < PreIter::t); return *PreIter::p; }
69  };
70 
71  class MutIter: public PreIter, public MutPreIter<MutIter, T> {
72  public:
73  inline MutIter(self_t& a): PreIter(a) { }
74  inline MutIter(self_t& a, bool e): PreIter(a, e) { }
75  inline T& item() const { ASSERT(PreIter::p < PreIter::t); return *const_cast<T *>(PreIter::p); }
76  };
77 
78  class BackPreIter: public elm::PreIter<BackPreIter, T> {
79  public:
80  inline BackPreIter(): p(nullptr), t(nullptr) { }
81  inline BackPreIter(const Array<T>& table): p(table.buffer() + table.count() - 1), b(table.buffer()) { }
82  inline BackPreIter(const Array<T>& table, bool end): p(table.buffer() + (end ? 0 : table.count()) - 1), b(table.buffer()) { }
83  inline bool ended(void) const { return p < b; }
84  inline void next(void) { p--; }
85  inline bool equals(const BackPreIter& i) const { return p == i.p && b == i.b; }
86  protected:
87  const T *p, *b;
88  };
89 
90  class BackIter: public BackPreIter, public ConstPreIter<BackIter, T> {
91  public:
93  inline const T& item() const { ASSERT(BackPreIter::p < BackPreIter::t); return *BackPreIter::p; }
94  };
95 
96  class BackMutIter: public BackPreIter, public MutPreIter<BackMutIter, T> {
97  public:
98  inline BackMutIter(self_t& a): BackPreIter(a) { }
99  inline BackMutIter(self_t& a, bool e): BackPreIter(a, e) { }
100  inline T& item() const { ASSERT(BackPreIter::p >= BackPreIter::b); return *const_cast<T *>(BackPreIter::p); }
101  };
102 
103  // Collection concept
104  static const Array<T> null;
105  inline Iter items(void) const { return Iter(*this); }
106  inline Iter operator*(void) const { return items(); }
107  inline Iter begin(void) const { return items(); }
108  inline Iter end(void) const { return Iter(*this, true); }
109  inline Iterable<BackIter> back() const { return subiter(BackIter(*this), BackIter(*this, true)); }
110 
111  inline int count(void) const { return cnt; }
112  inline bool contains(const T& item)
113  { for(auto x: *this) if(x == item) return true; return false; }
114  template <class C> inline bool containsAll(const C& c)
115  { for(auto x: c) if(!contains(x)) return false; return true; }
116  inline bool isEmpty(void) const { return cnt == 0; }
117  inline operator bool(void) const { return !isEmpty(); }
118  inline bool equals(const Array<T>& a) const {
119  if(cnt != a.cnt) return false;
120  for(auto i = begin(), j = a.begin(); i(); ++i, ++j)
121  if(*i != *j) return false;
122  return true;
123  }
124  inline bool operator==(const Array<T>& a) const { return equals(a); }
125  inline bool operator!=(const Array<T>& a) const { return !equals(a); }
126  inline bool operator<=(const Array<T>& a) const { return a.containsAll(*this); }
127  inline bool operator<(const Array<T>& a) const { return a.containsAll(*this) && !equals(a); }
128  inline bool operator>=(const Array<T>& a) const { return containsAll(a); }
129  inline bool operator>(const Array<T>& a) const { return containsAll(a) && !equals(a); }
130 
131  // Array concept
132  inline int length(void) const { return count(); }
133  inline const T& get(int idx) const { ASSERT(0 <= idx && idx < cnt); return buf[idx]; }
134  inline int indexOf(const T& v, int i = 0) const
135  { for(; i < count(); i++) if(v == get(i)) return i; return -1; }
136  inline int lastIndexOf(const T& v, int i = -1) const
137  { if(i < 0) i = count() - 1; for(; i >= 0; i--) if(v == get(i)) return i; return -1; }
138  inline const T& operator[](int idx) const { return get(idx); }
139 
140  // MutableArray concept
141  inline void set(int idx, const T& val) { ASSERT(0 <= idx && idx < cnt); buf[idx] = val; }
142  inline void set(const MutIter& i, const T& val) { ASSERT(!i.ended()); *i = val; }
143  inline T& get(int idx) { ASSERT(0 <= idx && idx < cnt); return buf[idx]; }
144  inline T& operator[](int idx) { return get(idx); }
145  inline MutIter begin(void) { return MutIter(*this); }
146  inline MutIter end(void) { return MutIter(*this, true); }
147  inline Iterable<BackMutIter> back() { return subiter(BackMutIter(*this), BackMutIter(*this, true)); }
148 
149 
150 protected:
151  int cnt;
152  T *buf;
153 };
154 
155 template <class T>
157 
158 
159 template <class T>
160 class AllocArray: public Array<T> {
161 public:
162  inline AllocArray(void) { }
163  inline AllocArray(int count, T *buffer): Array<T>(count, buffer) { }
164  inline AllocArray(int count): Array<T>(count, new T[count]) { }
165  inline AllocArray(int count, const T& val): Array<T>(count, new T[count]) { fill(val); }
166  inline AllocArray(const Array<T>& t): Array<T>(t.count(), new T[t.count()]) { Array<T>::copy(t); }
167  inline AllocArray(const AllocArray<T>& t): Array<T>(t.cnt, new T[t.cnt]) { Array<T>::copy(t); }
168  inline ~AllocArray(void) { if(this->buf) delete [] this->buf; }
169 
170  inline void copy(const Array<T>& t)
171  { if(this->count() < t.count()) { if(this->buf) delete [] this->buf;
172  Array<T>::set(t.count(), new T[t.count()]); } Array<T>::copy(t); }
173  inline void tie(int cnt, T *buffer) { if(this->buf) delete [] this->buf; Array<T>::set(cnt, buffer); }
174  inline void tie(const Array<T>& t) { if(this->buf) delete [] this->buf; Array<T>::set(t); }
175 
176  inline AllocArray<T>& operator=(const Array<T>& t) { copy(t); return *this; }
177  inline AllocArray<T>& operator=(const AllocArray<T>& t) { copy(t); return *this; }
178 };
179 
180 template <class T>
181 inline Array<T> _array(int n, T t[]) { return Array<T>(n, t); }
182 
183 } // elm
184 
185 #endif /* ELM_ARRAY_TABLE_H_ */
Definition: Array.h:160
~AllocArray(void)
Definition: Array.h:168
AllocArray(int count, T *buffer)
Definition: Array.h:163
AllocArray< T > & operator=(const Array< T > &t)
Definition: Array.h:176
AllocArray(int count)
Definition: Array.h:164
void tie(const Array< T > &t)
Definition: Array.h:174
void copy(const Array< T > &t)
Definition: Array.h:170
AllocArray(const Array< T > &t)
Definition: Array.h:166
AllocArray(const AllocArray< T > &t)
Definition: Array.h:167
AllocArray< T > & operator=(const AllocArray< T > &t)
Definition: Array.h:177
AllocArray(void)
Definition: Array.h:162
AllocArray(int count, const T &val)
Definition: Array.h:165
void tie(int cnt, T *buffer)
Definition: Array.h:173
Definition: Array.h:90
const T & item() const
Definition: Array.h:93
Definition: Array.h:96
T & item() const
Definition: Array.h:100
BackMutIter(self_t &a, bool e)
Definition: Array.h:99
BackMutIter(self_t &a)
Definition: Array.h:98
Definition: Array.h:78
BackPreIter(const Array< T > &table)
Definition: Array.h:81
BackPreIter(const Array< T > &table, bool end)
Definition: Array.h:82
const T * b
Definition: Array.h:87
void next(void)
Definition: Array.h:84
BackPreIter()
Definition: Array.h:80
const T * p
Definition: Array.h:87
bool equals(const BackPreIter &i) const
Definition: Array.h:85
bool ended(void) const
Definition: Array.h:83
Definition: Array.h:65
const T & item() const
Definition: Array.h:68
Definition: Array.h:71
MutIter(self_t &a)
Definition: Array.h:73
T & item() const
Definition: Array.h:75
MutIter(self_t &a, bool e)
Definition: Array.h:74
Definition: Array.h:52
PreIter(const Array< T > &table)
Definition: Array.h:56
PreIter(const Array< T > &table, bool end)
Definition: Array.h:57
void next(void)
Definition: Array.h:59
PreIter()
Definition: Array.h:55
bool equals(const PreIter &i) const
Definition: Array.h:60
const T * p
Definition: Array.h:62
const T * t
Definition: Array.h:62
bool ended(void) const
Definition: Array.h:58
Definition: Array.h:33
bool containsAll(const C &c)
Definition: Array.h:114
T & get(int idx)
Definition: Array.h:143
void set(const MutIter &i, const T &val)
Definition: Array.h:142
bool operator>=(const Array< T > &a) const
Definition: Array.h:128
bool operator<=(const Array< T > &a) const
Definition: Array.h:126
const T & get(int idx) const
Definition: Array.h:133
T t
Definition: Array.h:35
void fill(const T &val)
Definition: Array.h:47
MutIter end(void)
Definition: Array.h:146
void set(int idx, const T &val)
Definition: Array.h:141
bool operator>(const Array< T > &a) const
Definition: Array.h:129
void set(int count, T *buffer)
Definition: Array.h:44
T * operator()(void)
Definition: Array.h:49
void set(const Array< T > &t)
Definition: Array.h:45
Iter end(void) const
Definition: Array.h:108
int lastIndexOf(const T &v, int i=-1) const
Definition: Array.h:136
MutIter begin(void)
Definition: Array.h:145
Iter operator*(void) const
Definition: Array.h:106
Iterable< BackMutIter > back()
Definition: Array.h:147
Iterable< BackIter > back() const
Definition: Array.h:109
void copy(const Array &t)
Definition: Array.h:46
bool operator<(const Array< T > &a) const
Definition: Array.h:127
Iter begin(void) const
Definition: Array.h:107
int count(void) const
Definition: Array.h:111
bool equals(const Array< T > &a) const
Definition: Array.h:118
const T * operator()(void) const
Definition: Array.h:48
T * buf
Definition: Array.h:152
int length(void) const
Definition: Array.h:132
const T & operator[](int idx) const
Definition: Array.h:138
int cnt
Definition: Array.h:151
Iter items(void) const
Definition: Array.h:105
const T * buffer(void) const
Definition: Array.h:41
Array(int count, T *buffer)
Definition: Array.h:39
Array< T > & operator=(const Array< T > &t)
Definition: Array.h:50
bool operator!=(const Array< T > &a) const
Definition: Array.h:125
T * buffer(void)
Definition: Array.h:42
Array(void)
Definition: Array.h:38
bool operator==(const Array< T > &a) const
Definition: Array.h:124
Array< T > self_t
Definition: Array.h:36
int size(void) const
Definition: Array.h:43
int indexOf(const T &v, int i=0) const
Definition: Array.h:134
bool isEmpty(void) const
Definition: Array.h:116
T & operator[](int idx)
Definition: Array.h:144
bool contains(const T &item)
Definition: Array.h:112
Definition: iter.h:84
Definition: util.h:220
Definition: iter.h:92
Definition: iter.h:69
T t
Definition: iter.h:71
Array< T > _array(int n, T t[])
Definition: Array.h:181
const T & min(const T &x, const T &y)
Definition: compare.h:104
void copy(T *target, const T *source, int size)
Definition: array.h:70
void set(T *target, int size, const T &v)
Definition: array.h:76
Definition: adapter.h:26
Iterable< I > subiter(const I &b, const I &e)
Definition: util.h:231