Subversion Repositories spk

Rev

Rev 1 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
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)