Newer
Older
cg / sources / array.cpp
@ajaggi ajaggi on 26 Dec 2005 1 KB Changes:
#include <assert.h>

class Array {
private:
	int _size;
	int _current;
	int _stacksize;
	void** _data;
public:
	Array() {
		_size = 0;
		_current = 0;
		_stacksize = 0;
	}

	Array(Array* oa) {
		_size = 0;
		_current = 0;
		_stacksize = 0;
		void* telem;
		int tc = oa->pos();
		oa->reset();

		while ( (telem = oa->next()) ) {
			push(telem);
		}

		oa->setPos(tc);

	}

	void setPos(int np) {
		_current = np;
	}

	int pos() {
		return _current;
	}

	int length() {
		return _size;
	}

	void reset() {
		_current = 0;
	}

	void* current() {
		if ( _current < _size ) {
			return _data[_current];
		} else {
			return 0;
		}
	}

	void* next() {
		if ( _current < _size ) {
			_current++;
			return _data[_current-1];
		} else {
			return 0;
		}
	}

	void push(void* elem) {
		if ( _size >= _stacksize ) {
			_stacksize = _stacksize + 3;
			void** tdat = new void*[_stacksize];

			for ( int i = 0; i < _size; i++ ) {
				tdat[i] = _data[i];
			}

			if ( _size > 0 ) {
				delete[] _data;
			}
			_data = tdat;
		}

		_data[_size] = elem;
		_size++;
	}

	void* pop() {
		_size--;
		if ( _current == _size ) {
			_current = _size-1;
		}
		return _data[_size];
	}

	void* get(int p) {
		assert(p>=0);
		assert(p<_size);
		return _data[p];
	}

	void set(int p, void* ne) {
		assert(p>=0);
		assert(p<_size);
		_data[p] = ne;
	}

	void clear() {
		_size = 0;
		_current = 0;
		_stacksize = 0;
		delete[] _data;
	}

	void operator+=(void* ne) {
		push(ne);
	}

	void*& operator[](int p) {
		assert(p>=0);
		assert(p<_size);
		return _data[p];
	}

	~Array() {
		delete[] _data;
	}
};