| 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)
 |