| 1 |
cycrow |
1 |
#ifndef EXT_ARRAY_INCLUDED
|
|
|
2 |
#define EXT_ARRAY_INCLUDED
|
|
|
3 |
|
|
|
4 |
#include <memory.h>
|
|
|
5 |
|
|
|
6 |
namespace ext
|
|
|
7 |
{
|
|
|
8 |
|
|
|
9 |
template <class Ty>
|
|
|
10 |
class array
|
|
|
11 |
{
|
|
|
12 |
public:
|
|
|
13 |
typedef size_t size_type;
|
|
|
14 |
typedef Ty value_type;
|
|
|
15 |
typedef Ty* value_type_ptr;
|
|
|
16 |
typedef Ty& reference;
|
|
|
17 |
typedef const Ty& const_reference;
|
|
|
18 |
typedef int difference_type;
|
|
|
19 |
|
|
|
20 |
class const_iterator
|
|
|
21 |
{
|
|
|
22 |
protected:
|
|
|
23 |
value_type *m_ptr;
|
|
|
24 |
|
|
|
25 |
public:
|
|
|
26 |
const_iterator() { }
|
|
|
27 |
const_iterator(value_type *ptr) { m_ptr=ptr; }
|
|
|
28 |
const_iterator(const const_iterator& other) { m_ptr=other.m_ptr; }
|
|
|
29 |
|
|
|
30 |
const_iterator& operator ++() { m_ptr++; return *this; }
|
|
|
31 |
const_iterator operator ++(int) { m_ptr++; return const_iterator(m_ptr - 1); }
|
|
|
32 |
|
|
|
33 |
const_iterator& operator --() { m_ptr--; return *this; }
|
|
|
34 |
const_iterator operator --(int) { m_ptr--; return const_iterator(m_ptr + 1); }
|
|
|
35 |
|
|
|
36 |
const_reference operator * () const { return *m_ptr; }
|
|
|
37 |
const_reference operator -> () const { return *m_ptr; }
|
|
|
38 |
|
|
|
39 |
bool operator ==(const_iterator& right) const { return right.m_ptr==m_ptr; }
|
|
|
40 |
bool operator !=(const_iterator& right) const { return right.m_ptr!=m_ptr; }
|
| 114 |
cycrow |
41 |
|
|
|
42 |
const_iterator operator + (int i) { return const_iterator(m_ptr + i); }
|
| 1 |
cycrow |
43 |
};
|
|
|
44 |
|
|
|
45 |
class iterator : public const_iterator
|
|
|
46 |
{
|
|
|
47 |
public:
|
|
|
48 |
iterator() { }
|
|
|
49 |
iterator(value_type *ptr) : const_iterator(ptr) { }
|
|
|
50 |
iterator(const iterator& other) : const_iterator(other) { }
|
|
|
51 |
|
|
|
52 |
iterator& operator ++() { m_ptr++; return *this; }
|
|
|
53 |
iterator operator ++(int) { m_ptr++; return iterator(m_ptr - 1); }
|
|
|
54 |
|
|
|
55 |
iterator& operator --() { m_ptr--; return *this; }
|
|
|
56 |
iterator operator --(int) { m_ptr--; return iterator(m_ptr + 1); }
|
|
|
57 |
|
|
|
58 |
reference operator * () { return *m_ptr; }
|
|
|
59 |
reference operator -> () { return *m_ptr; }
|
| 114 |
cycrow |
60 |
|
|
|
61 |
iterator operator + (int i) { return iterator(m_ptr + i); }
|
| 1 |
cycrow |
62 |
};
|
|
|
63 |
|
|
|
64 |
protected:
|
|
|
65 |
value_type *m_first, *m_last, *m_end;
|
|
|
66 |
|
|
|
67 |
private:
|
| 114 |
cycrow |
68 |
static const int DEFAULT_GROWBY = 100;
|
| 1 |
cycrow |
69 |
size_type m_growby;
|
|
|
70 |
|
|
|
71 |
public:
|
|
|
72 |
size_type size() const { return m_last - m_first; }
|
|
|
73 |
size_type capacity() const { return m_end - m_first; }
|
|
|
74 |
|
|
|
75 |
size_type growby() const { return m_growby; }
|
| 114 |
cycrow |
76 |
void growby(size_type grow) { m_growby=grow > 0 ? grow : DEFAULT_GROWBY; }
|
| 1 |
cycrow |
77 |
|
| 114 |
cycrow |
78 |
array() { growby(DEFAULT_GROWBY); m_first=0; clear(); }
|
|
|
79 |
array(size_type size) { growby(DEFAULT_GROWBY); m_first=0; clear(); resize(size); }
|
| 1 |
cycrow |
80 |
~array() { delete[] m_first; }
|
|
|
81 |
|
|
|
82 |
void reserve(size_type newsize)
|
|
|
83 |
{
|
|
|
84 |
if(newsize > capacity()){
|
|
|
85 |
size_t oldsize=size();
|
|
|
86 |
value_type *newbuf=new value_type[newsize];
|
|
|
87 |
memcpy(newbuf, m_first, oldsize * sizeof(value_type));
|
|
|
88 |
delete[] m_first;
|
|
|
89 |
m_first=newbuf;
|
|
|
90 |
m_end=m_first + newsize;
|
|
|
91 |
m_last=m_first + oldsize;
|
|
|
92 |
}
|
|
|
93 |
}
|
|
|
94 |
|
|
|
95 |
void resize(size_type newsize)
|
|
|
96 |
{
|
|
|
97 |
if(newsize==0) return;
|
|
|
98 |
reserve(newsize);
|
|
|
99 |
m_last=m_first + newsize;
|
|
|
100 |
}
|
|
|
101 |
|
|
|
102 |
void resize(size_type newsize, value_type value)
|
|
|
103 |
{
|
|
|
104 |
resize(newsize);
|
|
|
105 |
value_type_ptr pos=m_first;
|
|
|
106 |
for(value_type_ptr pos=m_first; pos < m_last; pos++){
|
|
|
107 |
*pos=value;
|
|
|
108 |
}
|
|
|
109 |
}
|
|
|
110 |
|
|
|
111 |
void clear()
|
|
|
112 |
{
|
|
|
113 |
delete m_first;
|
|
|
114 |
m_first=0; m_last=0; m_end=0;
|
|
|
115 |
}
|
|
|
116 |
|
|
|
117 |
reference operator[](difference_type offset) { return *(m_first + offset); }
|
|
|
118 |
const_reference operator[](difference_type offset) const { return *(m_first + offset); }
|
|
|
119 |
|
|
|
120 |
reference at(difference_type offset) { return *(m_first + offset); }
|
|
|
121 |
const_reference at(difference_type offset) const { return *(m_first + offset); }
|
|
|
122 |
|
|
|
123 |
iterator begin() { return iterator(m_first); }
|
|
|
124 |
iterator end() { return iterator(m_last); }
|
|
|
125 |
|
|
|
126 |
const_iterator begin() const { return const_iterator(m_first); }
|
|
|
127 |
const_iterator end() const { return const_iterator(m_last); }
|
|
|
128 |
|
|
|
129 |
reference front() { return *begin(); }
|
|
|
130 |
reference back() { return *(--end()); }
|
|
|
131 |
|
|
|
132 |
const_reference front() const { return *begin(); }
|
|
|
133 |
const_reference back() const { return *(end() - 1); }
|
|
|
134 |
|
|
|
135 |
iterator push_back(const_reference val)
|
|
|
136 |
{
|
|
|
137 |
if(size() == capacity())
|
|
|
138 |
reserve(capacity() + growby());
|
|
|
139 |
*m_last=val;
|
|
|
140 |
return iterator(m_last++);
|
|
|
141 |
}
|
|
|
142 |
|
| 114 |
cycrow |
143 |
void pop_back()
|
|
|
144 |
{
|
|
|
145 |
if(size())
|
|
|
146 |
m_last--;
|
|
|
147 |
}
|
|
|
148 |
|
| 1 |
cycrow |
149 |
typedef int compare_callback (const void *, const void *);
|
|
|
150 |
|
|
|
151 |
void sort(compare_callback *callback)
|
|
|
152 |
{
|
|
|
153 |
qsort(m_first, size(), sizeof(value_type), callback);
|
|
|
154 |
}
|
|
|
155 |
|
|
|
156 |
void append(array<value_type>& other)
|
|
|
157 |
{
|
|
|
158 |
reserve(size() + other.size());
|
|
|
159 |
memcpy(m_first + size(), other.m_first, other.size() * sizeof(value_type));
|
|
|
160 |
m_last+=other.size();
|
|
|
161 |
}
|
|
|
162 |
|
| 114 |
cycrow |
163 |
iterator find(const_reference what)
|
|
|
164 |
{
|
|
|
165 |
iterator it;
|
|
|
166 |
for(it=begin(); it!=end(); ++it){
|
|
|
167 |
if(*it==what)
|
|
|
168 |
break;
|
|
|
169 |
}
|
|
|
170 |
return it;
|
|
|
171 |
}
|
|
|
172 |
|
|
|
173 |
iterator erase(iterator& where)
|
|
|
174 |
{
|
|
|
175 |
if(where==end()) return where;
|
|
|
176 |
iterator src=where + 1;
|
|
|
177 |
iterator dest=where;
|
|
|
178 |
while(src!=end()){
|
|
|
179 |
*dest=*src;
|
|
|
180 |
++dest; ++src;
|
|
|
181 |
}
|
|
|
182 |
m_last--;
|
|
|
183 |
return where;
|
|
|
184 |
}
|
| 1 |
cycrow |
185 |
};
|
|
|
186 |
|
|
|
187 |
}; // namespace ext
|
|
|
188 |
|
|
|
189 |
#endif // !defined(EXT_ARRAY_INCLUDED)
|