From ed24618061962fc02d6ee6f2adfe94a53e9cb6b6 Mon Sep 17 00:00:00 2001 From: q66 Date: Sun, 17 May 2015 17:11:56 +0100 Subject: [PATCH] vector: clear does not free buffer + add operator= for initializer list --- octa/vector.h | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/octa/vector.h b/octa/vector.h index a48f92e..3ec6374 100644 --- a/octa/vector.h +++ b/octa/vector.h @@ -84,18 +84,17 @@ namespace octa { ~Vector() noexcept(IsNothrowDestructible::value) { clear(); + delete[] (uchar *)p_buf; + p_buf = nullptr; + p_cap = 0; } void clear() noexcept(IsNothrowDestructible::value) { - if (p_cap > 0) { - if (!octa::IsPod()) { - T *cur = p_buf, *last = p_buf + p_len; - while (cur != last) (*cur++).~T(); - } - delete[] (uchar *)p_buf; - p_buf = nullptr; - p_len = p_cap = 0; + if (p_len > 0 && !octa::IsPod()) { + T *cur = p_buf, *last = p_buf + p_len; + while (cur != last) (*cur++).~T(); } + p_len = 0; } Vector &operator=(const Vector &v) noexcept( @@ -112,6 +111,7 @@ namespace octa { p_len = v.p_len; } else { clear(); + delete[] (uchar *)p_buf; p_len = v.p_len; p_cap = v.p_cap; p_buf = (T *)new uchar[p_cap * sizeof(T)]; @@ -134,12 +134,32 @@ namespace octa { IsNothrowDestructible::value ) { clear(); + delete[] (uchar *)p_buf; p_len = v.p_len; p_cap = v.p_cap; p_buf = v.disown(); return *this; } + Vector &operator=(InitializerList il) noexcept( + IsNothrowDestructible::value && + IsNothrowCopyConstructible::value + ) { + clear(); + size_t ilen = il.length(); + reserve(ilen); + if (octa::IsPod()) { + memcpy(p_buf, il.get(), ilen); + } else { + T *buf = p_buf, *ibuf = il.get(), *last = il.get() + ilen; + while (ibuf != last) { + new (buf++) T(*ibuf++); + } + } + p_len = ilen; + return *this; + } + void resize(size_t n, const T &v = T()) noexcept( IsNothrowDestructible::value && IsNothrowMoveConstructible::value