#ifndef VECTOR_HH #define VECTOR_HH #include #include #ifdef HAVE_NEW_HDR # include #elif defined(HAVE_NEW_H) # include #else static inline void *operator new(size_t, void *v) { return v; } #endif template class Vector { public: typedef T value_type; typedef T& reference; typedef const T& const_reference; typedef T* pointer; typedef const T* const_pointer; typedef int size_type; typedef T* iterator; typedef const T* const_iterator; Vector() : _l(0), _n(0), _cap(0) { } explicit Vector(int cap) : _l(0), _n(0), _cap(0) { reserve(cap); } Vector(size_type n, const T &e) : _l(0), _n(0), _cap(0) { resize(n, e); } Vector(const Vector &); ~Vector(); // iterators iterator begin() { return _l; } const_iterator begin() const { return _l; } iterator end() { return _l + _n; } const_iterator end() const { return _l + _n; } // capacity size_type size() const { return _n; } void resize(size_type nn, const T &e = T()); bool reserve(size_type); const T &at(size_type i) const { assert(i>=0 && i<_n); return _l[i]; } const T &operator[](size_type i) const { return at(i); } const T &back() const { return at(_n - 1); } const T &at_u(size_type i) const { return _l[i]; } T &at(size_type i) { assert(i>=0 && i<_n); return _l[i]; } T &operator[](size_type i) { return at(i); } T &back() { return at(_n - 1); } T &at_u(size_type i) { return _l[i]; } void push_back(const T &); void pop_back(); void clear() { shrink(0); } Vector &operator=(const Vector &); Vector &assign(size_type n, const T &e = T()); void swap(Vector &); private: T *_l; int _n; int _cap; void *velt(int i) const { return (void *)&_l[i]; } static void *velt(T *l, int i) { return (void *)&l[i]; } void shrink(size_type nn); }; template inline void Vector::push_back(const T &e) { if (_n < _cap || reserve(-1)) { new(velt(_n)) T(e); _n++; } } template inline void Vector::pop_back() { assert(_n > 0); --_n; _l[_n].~T(); } template <> class Vector { public: typedef void* value_type; typedef void*& reference; typedef void* const& const_reference; typedef void** pointer; typedef void* const* const_pointer; typedef int size_type; typedef void** iterator; typedef void* const* const_iterator; Vector() : _l(0), _n(0), _cap(0) { } explicit Vector(int cap) : _l(0), _n(0), _cap(0) { reserve(cap); } Vector(int n, void *e) : _l(0), _n(0), _cap(0) { resize(n, e); } Vector(const Vector &); ~Vector(); // iterators iterator begin() { return _l; } const_iterator begin() const { return _l; } iterator end() { return _l + _n; } const_iterator end() const { return _l + _n; } size_type size() const { return _n; } void *at(int i) const { assert(i>=0 && i<_n); return _l[i]; } void *operator[](int i) const { return at(i); } void *back() const { return at(_n - 1); } void *at_u(int i) const { return _l[i]; } void *&at(int i) { assert(i>=0 && i<_n); return _l[i]; } void *&operator[](int i) { return at(i); } void *&back() { return at(_n - 1); } void *&at_u(int i) { return _l[i]; } void push_back(void *); void pop_back(); void clear() { _n = 0; } bool reserve(int); void resize(int nn, void *e = 0); Vector &operator=(const Vector &); Vector &assign(int n, void *e = 0); void swap(Vector &); private: void **_l; int _n; int _cap; }; inline void Vector::push_back(void *e) { if (_n < _cap || reserve(-1)) { _l[_n] = e; _n++; } } inline void Vector::pop_back() { assert(_n > 0); --_n; } template class Vector: private Vector { typedef Vector Base; public: typedef T* value_type; typedef T*& reference; typedef T* const& const_reference; typedef T** pointer; typedef T* const* const_pointer; typedef int size_type; typedef T** iterator; typedef T* const* const_iterator; Vector() : Base() { } explicit Vector(int cap) : Base(cap) { } Vector(int n, T *e) : Base(n, (void *)e) { } Vector(const Vector &o) : Base(o) { } ~Vector() { } // iterators const_iterator begin() const{ return (const_iterator)(Base::begin()); } iterator begin() { return (iterator)(Base::begin()); } const_iterator end() const { return (const_iterator)(Base::end()); } iterator end() { return (iterator)(Base::end()); } int size() const { return Base::size(); } T *operator[](int i) const { return (T *)(Base::at(i)); } T *at(int i) const { return (T *)(Base::at(i)); } T *back() const { return (T *)(Base::back()); } T *at_u(int i) const { return (T *)(Base::at_u(i)); } T *&operator[](int i) { return (T *&)(Base::at(i)); } T *&at(int i) { return (T *&)(Base::at(i)); } T *&back() { return (T *&)(Base::back()); } T *&at_u(int i) { return (T *&)(Base::at_u(i)); } void push_back(T *e) { Base::push_back((void *)e); } void pop_back() { Base::pop_back(); } void clear() { Base::clear(); } bool reserve(int n) { return Base::reserve(n); } void resize(int n, T *e = 0) { Base::resize(n, (void *)e); } Vector &operator=(const Vector &o) { Base::operator=(o); return *this; } Vector &assign(int n, T *e = 0) { Base::assign(n, (void *)e); return *this; } void swap(Vector &o) { Base::swap(o); } }; #endif