#include // AbstractArray.cpp #include "AbstractArray.h" template AbstractArray::AbstractArray(int capacity) : _size(0), _capacity(capacity), _t(NULL) { // L'allocation/affectation du pointeur _t // est a la charge des classes derivees ! } template AbstractArray::AbstractArray(const AbstractArray& a) { _copy(a); } template AbstractArray& AbstractArray::operator=(const AbstractArray& a) { if(this != &a) { _destroy(); _copy(a); } return *this; } template AbstractArray::AbstractArray(const T* CArray, int capacity) : _size(0), _capacity(capacity), _t(NULL) { // L'allocation/affectation du pointeur _t // est a la charge des classes derivees ! // // Et la boucle suivante aussi. // En effet, le tableau n'existe reellement que lorsque le // constructeur de la classe derivee a ete execute ... // ... Et donc apres l'appel du present constructeur ! // // for(int i = 0; i < capacity; i++) // { // insert(CArray[i]); // } (void)CArray; } template AbstractArray::~AbstractArray(void) { _destroy(); } template AbstractArray::operator T*(void) { return _t; } template int AbstractArray::size(void) const { return _size; } template int AbstractArray::capacity(void) const { return _capacity; } template bool AbstractArray::empty(void) const { return _size == 0; } template bool AbstractArray::full(void) const { return _size == _capacity; } template int AbstractArray::has(const T& element) const // retourne l’index ou -1 { for(int i = 0; i <_size; i++) { if (_t[i] == element) return i; } return -1; } template T& AbstractArray::operator[](int index) { assert(index >= 0 && index <_size); return _t[index]; } template const T& AbstractArray::operator[](int index) const { assert(index >= 0 && index <_size); return _t[index]; } template bool AbstractArray::operator==(const AbstractArray& a) const { if(_size != a._size) return false; if(_capacity != a._capacity) return false; for(int i = 0; i <_size; i++) { if (_t[i] != a._t[i]) return false; } return true; } template bool AbstractArray::operator!=(const AbstractArray& a) const { return !operator==(a); } template AbstractArray& AbstractArray::operator+=(const AbstractArray& a) { for(int i = 0; i < a._size ; i++) { insert(a._t[i]); } return *this; } template AbstractArray& AbstractArray::operator<<(const T& element) { insert(element); return *this; } template AbstractArray& AbstractArray::operator>>(T& element) { element = remove(); return *this; } template T AbstractArray::operator()(const T& t, T (*f)(const T&,const T&)) const { T result = t; for(int i = 0; i <_size; i++) { result = f(result,_t[i]); } return result; } template T AbstractArray::remove(void) { assert(!empty()); return _t[--_size]; } template void AbstractArray::_copy(const AbstractArray& a) { _size = a._size; _capacity = a._capacity; } template void AbstractArray::_destroy(void) { this->_size = 0; this->_capacity = 0; this->_t = NULL; } template ostream& operator<<(ostream& s, const AbstractArray& a) { s << '('; if (!a.empty()) { for(int i = 0; i < a._size - 1; i++) { s << a._t[i] << ','; } s << a._t[a._size - 1]; } return s << ')'; }