cleanup insert + move variant

This commit is contained in:
q66 2015-04-16 22:44:25 +01:00
parent 172b62fa92
commit 953e4a2afa

View file

@ -79,6 +79,17 @@ namespace octa {
T *p_buf; T *p_buf;
size_t p_len, p_cap; size_t p_len, p_cap;
void insert_base(size_t idx, size_t n) {
if (p_len + n > p_cap) reserve(p_len + n);
p_len += n;
for (size_t i = p_len - 1; i > idx + n - 1; --i) {
if (octa::IsClass<T>::value && i < (p_len - n)) {
p_buf[i].~T();
}
new (&p_buf[i]) T(move(p_buf[i - n]));
}
}
public: public:
enum { MIN_SIZE = 8 }; enum { MIN_SIZE = 8 };
@ -274,28 +285,22 @@ namespace octa {
return r; return r;
} }
T *insert(size_t idx, const T &v) { T *insert(size_t idx, T &&v) {
if (p_len == p_cap) reserve(p_len + 1); insert_base(idx, 1);
++p_len; p_buf[idx].~T();
for (size_t i = p_len - 1; i > idx; --i) { new (&p_buf[idx]) T(forward<T>(v));
if (octa::IsClass<T>::value && i != (p_len - 1)) return &p_buf[idx];
p_buf[i].~T();
new (&p_buf[i]) T(move(p_buf[i - 1]));
} }
T *insert(size_t idx, const T &v) {
insert_base(idx, 1);
p_buf[idx].~T(); p_buf[idx].~T();
new (&p_buf[idx]) T(v); new (&p_buf[idx]) T(v);
return &p_buf[idx]; return &p_buf[idx];
} }
T *insert(size_t idx, size_t n, const T &v) { T *insert(size_t idx, size_t n, const T &v) {
if (p_len + n > p_cap) reserve(p_len + n); insert_base(idx, n);
p_len += n;
for (size_t i = p_len - 1; i > idx + n - 1; --i) {
if (octa::IsClass<T>::value && i < (p_len - n)) {
p_buf[i].~T();
}
new (&p_buf[i]) T(move(p_buf[i - n]));
}
for (size_t i = 0; i < n; ++i) { for (size_t i = 0; i < n; ++i) {
p_buf[idx + i].~T(); p_buf[idx + i].~T();
new (&p_buf[idx + i]) T(v); new (&p_buf[idx + i]) T(v);