|
From: julien r. <jul...@us...> - 2004-11-30 18:22:06
|
Update of /cvsroot/epfl/tgengine-0.1/tg_stl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23531/tg_stl Added Files: vector.h Log Message: cf Changelog@wiki --- NEW FILE: vector.h --- #ifndef TGVECTOR_H #define TGVECTOR_H #include <iostream> namespace tg { /** * Le nombre d'objet qui est reserve en __plus__ à chaque push_back qui demande un resize * Ca permet d'éviter de devoir appeler resize à chaque push_back, mais ça peut bouffer de la mémoire en plus */ #define RESERVE_RATIO 10 template <class _T> class Vector { public: inline Vector(int s=0); inline void push_back(_T); inline void resize (int s); inline void clear (); inline int size (); inline _T operator [] (int n) { return *(data+n); } inline _T at(int i); protected: _T* data; //represent le dernier element "interresant" stocke. donc le dernier element ajoute //par un push_back. Les elements ajoutes automatiquement par le resize ne sont justement //pas "interessant" int _storage_end; int _size; }; template <class _T> Vector<_T>::Vector(int s) { data = NULL; resize(s); _storage_end = 0; } template <class _T> void Vector<_T>::resize (int s) { if(s>_size) { data = (_T*)realloc(data, sizeof(_T)*(_size+s)); } else if (s<_size) { //on supprimer des elements. for (int i=0;i<_size-s;i++) { //on verifie que storage_end ne depasse pas la taille du vecteur if(_storage_end > s+i) _storage_end = s+i; } } _size = s; } template <class _T> void Vector<_T>::push_back (_T obj) { //doit-on allouer de la memoire ? if(_storage_end >= _size) { resize(_size+RESERVE_RATIO); } *(data + _storage_end) = obj; _storage_end++; } template <class _T> int Vector<_T>::size() { return _size; } template <class _T> _T Vector<_T>::at(int i) { if(i>=_size) { std::cerr << "[TSTL]Vector::at(), Erreur, index excede la taille du vecteur" << std::endl; } return *(data+i); } template <class _T> void Vector<_T>::clear() { resize (0); std::cout << _storage_end << std::endl; } } #endif |