#ifndef OPP_STATIC_VECTOR_H #define OPP_STATIC_VECTOR_H #include #include #include #include namespace opp { template class static_vector { protected: enum { m = N } _size; char _space[N * sizeof(T)]; public: typedef T element_type; static_vector(void) : _size(0) {} static_vector(size_t n) : _size(n) { #ifdef CAPACITYCHECK if (n > N) debugcrash(); #endif T * data = (T*)_space; for(size_t i=0; i void emplace_back(const P&... p); }; template void static_vector::clear(void) { T * data = (T*)_space; for(size_t i=0; i<_size; i++) data[i].~T(); _size = 0; } template void static_vector::resize(size_t n) { #ifdef CAPACITYCHECK if (n > N) debugcrash(); #endif T * data = (T*)_space; if (n < _size) { for(size_t i=n; i<_size; i++) data[i].~T(); } else if (n > 0) { for(size_t i=_size; i void static_vector::push_back(const T & t) { #ifdef CAPACITYCHECK if (_size >= N) debugcrash(); #endif new ((T*)_space + _size++)T(t); } template void static_vector::push_back(T && t) { #ifdef CAPACITYCHECK if (_size >= N) debugcrash(); #endif new ((T*)_space + _size++)T(t); } template template void static_vector::emplace_back(const P&... p) { #ifdef CAPACITYCHECK if (_size >= N) debugcrash(); #endif new ((T*)_space + _size++)T(p...); } template void static_vector::assign(size_t count, const T & t) { T * data = (T*)_space; for(size_t i=0; i<_size; i++) data[i].~T(); for(size_t i=0; i void static_vector::insert(size_t at, const T & t) { T * data = (T*)_space; new (data + _size)T(); for(size_t i=_size; i>at; i--) data[i] = move(data[i - 1]); data[at] = t; _size++; } template void static_vector::erase(size_t at, size_t n) { T * data = (T*)_space; _size -= n; for(size_t i=at; i<_size; i++) data[i] = move(data[i + n]); for(size_t i=0; i T * static_vector::insert(T * at, const T & t) { #ifdef CAPACITYCHECK if (_size >= N) debugcrash(); #endif T * data = (T*)_space; T * dp = data + _size; new (dp)T(); while (dp != at) { dp--; dp[1] = move(dp[0]); } dp[0] = t; _size++; return dp + 1; } } #endif