#ifndef OPP_VECTOR_H #define OPP_VECTOR_H #include #include namespace opp { template class vector { protected: T * _data; int _size, _capacity; public: typedef T element_type; vector(void) : _data(nullptr), _size(0), _capacity(0) {} vector(int n) : _data((T*)malloc(n * sizeof(T))), _size(n), _capacity(n) { for(int i=0; i void vector::reserve(int n) { if (n > _capacity) { _capacity = n; T * d = (T *)malloc(_capacity * sizeof(T)); for(int i=0; i<_size; i++) { new (d + i)T(move(_data[i])); _data[i].~T(); } free(_data); _data = d; } } template void vector::resize(int n) { if (n < _size) { for(int i=n; i<_size; i++) _data[i].~T(); _size = n; } else if (n < _capacity) { for(int i=_size; i void vector::shrink_to_fit(void) { if (_size < _capacity) { _capacity = _size; T * d = (T *)malloc(_capacity * sizeof(T)); for(int i=0; i<_size; i++) { new (d + i)T(move(_data[i])); _data[i].~T(); } free(_data); _data = d; } } template void vector::push_back(const T & t) { if (_size == _capacity) reserve(_size + 1 + (_size >> 1)); new (_data + _size++)T(t); } template void vector::push_back(T && t) { if (_size == _capacity) reserve(_size + 1 + (_size >> 1)); new (_data + _size++)T(t); } template void vector::insert(int at, const T & t) { if (_size == _capacity) reserve(_size + 1 + (_size >> 1)); new (_data + _size)T; for(int i=_size; i>at; i--) _data[i] = move(_data[i - 1]); _data[at] = t; } template void vector::erase(int at, int n) { _size -= n; for(int i=at; i<_size; i++) _data[i] = move(_data[i + n]); _data[_size].~T(); } } #endif