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