| | #include <assert.h> |
---|
| | |
---|
| | class Array { |
---|
| | private: |
---|
| | int _size; |
---|
| | int _current; |
---|
| | int _stacksize; |
---|
| | void** _data; |
---|
| | public: |
---|
| | Array() { |
---|
| | _size = 0; |
---|
| | _current = 0; |
---|
| | _stacksize = 0; |
---|
| | #include "array.h" |
---|
| | |
---|
| | Array::Array() { |
---|
| | _size = 0; |
---|
| | _current = 0; |
---|
| | _stacksize = 0; |
---|
| | } |
---|
| | |
---|
| | Array::Array(Array* oa) { |
---|
| | _size = 0; |
---|
| | _current = 0; |
---|
| | _stacksize = 0; |
---|
| | void* telem; |
---|
| | int tc = oa->pos(); |
---|
| | oa->reset(); |
---|
| | |
---|
| | while ( (telem = oa->next()) ) { |
---|
| | push(telem); |
---|
| | } |
---|
| | |
---|
| | Array(Array* oa) { |
---|
| | _size = 0; |
---|
| | _current = 0; |
---|
| | _stacksize = 0; |
---|
| | void* telem; |
---|
| | int tc = oa->pos(); |
---|
| | oa->reset(); |
---|
| | oa->setPos(tc); |
---|
| | |
---|
| | while ( (telem = oa->next()) ) { |
---|
| | push(telem); |
---|
| | } |
---|
| | |
---|
| | void Array::setPos(int np) { |
---|
| | _current = np; |
---|
| | } |
---|
| | |
---|
| | int Array::pos() { |
---|
| | return _current; |
---|
| | } |
---|
| | |
---|
| | int Array::length() { |
---|
| | return _size; |
---|
| | } |
---|
| | |
---|
| | void Array::reset() { |
---|
| | _current = 0; |
---|
| | } |
---|
| | |
---|
| | void* Array::current() { |
---|
| | if ( _current < _size ) { |
---|
| | return _data[_current]; |
---|
| | } else { |
---|
| | return 0; |
---|
| | } |
---|
| | } |
---|
| | |
---|
| | void* Array::next() { |
---|
| | if ( _current < _size ) { |
---|
| | _current++; |
---|
| | return _data[_current-1]; |
---|
| | } else { |
---|
| | return 0; |
---|
| | } |
---|
| | } |
---|
| | |
---|
| | void Array::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]; |
---|
| | } |
---|
| | |
---|
| | oa->setPos(tc); |
---|
| | |
---|
| | if ( _size > 0 ) { |
---|
| | delete[] _data; |
---|
| | } |
---|
| | _data = tdat; |
---|
| | } |
---|
| | |
---|
| | void setPos(int np) { |
---|
| | _current = np; |
---|
| | _data[_size] = elem; |
---|
| | _size++; |
---|
| | } |
---|
| | |
---|
| | void* Array::pop() { |
---|
| | _size--; |
---|
| | if ( _current == _size ) { |
---|
| | _current = _size-1; |
---|
| | } |
---|
| | return _data[_size]; |
---|
| | } |
---|
| | |
---|
| | int pos() { |
---|
| | return _current; |
---|
| | } |
---|
| | void* Array::get(int p) { |
---|
| | assert(p>=0); |
---|
| | assert(p<_size); |
---|
| | return _data[p]; |
---|
| | } |
---|
| | |
---|
| | int length() { |
---|
| | return _size; |
---|
| | } |
---|
| | void Array::set(int p, void* ne) { |
---|
| | assert(p>=0); |
---|
| | assert(p<_size); |
---|
| | _data[p] = ne; |
---|
| | } |
---|
| | |
---|
| | void reset() { |
---|
| | _current = 0; |
---|
| | } |
---|
| | void Array::clear() { |
---|
| | _size = 0; |
---|
| | _current = 0; |
---|
| | _stacksize = 0; |
---|
| | delete[] _data; |
---|
| | } |
---|
| | |
---|
| | void* current() { |
---|
| | if ( _current < _size ) { |
---|
| | return _data[_current]; |
---|
| | } else { |
---|
| | return 0; |
---|
| | } |
---|
| | } |
---|
| | void Array::operator+=(void* ne) { |
---|
| | push(ne); |
---|
| | } |
---|
| | |
---|
| | void* next() { |
---|
| | if ( _current < _size ) { |
---|
| | _current++; |
---|
| | return _data[_current-1]; |
---|
| | } else { |
---|
| | return 0; |
---|
| | } |
---|
| | } |
---|
| | void*& Array::operator[](int p) { |
---|
| | assert(p>=0); |
---|
| | assert(p<_size); |
---|
| | return _data[p]; |
---|
| | } |
---|
| | |
---|
| | void push(void* elem) { |
---|
| | if ( _size >= _stacksize ) { |
---|
| | _stacksize = _stacksize + 3; |
---|
| | void** tdat = new void*[_stacksize]; |
---|
| | Array::~Array() { |
---|
| | delete[] _data; |
---|
| | } |
---|
| | |
---|
| | 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; |
---|
| | } |
---|
| | }; |
---|
| | |
---|
| | |