Only call clear on prevector if it isn't trivially destructible and don't loop in clear
This commit is contained in:
parent
aaa02e7f24
commit
45a5aaf147
1 changed files with 12 additions and 5 deletions
|
@ -10,6 +10,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
/** Implements a drop-in replacement for std::vector<T> which stores up to N
|
/** Implements a drop-in replacement for std::vector<T> which stores up to N
|
||||||
|
@ -382,11 +383,15 @@ public:
|
||||||
iterator erase(iterator first, iterator last) {
|
iterator erase(iterator first, iterator last) {
|
||||||
iterator p = first;
|
iterator p = first;
|
||||||
char* endp = (char*)&(*end());
|
char* endp = (char*)&(*end());
|
||||||
|
if (!std::is_trivially_destructible<T>::value) {
|
||||||
while (p != last) {
|
while (p != last) {
|
||||||
(*p).~T();
|
(*p).~T();
|
||||||
_size--;
|
_size--;
|
||||||
++p;
|
++p;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
_size -= last - p;
|
||||||
|
}
|
||||||
memmove(&(*first), &(*last), endp - ((char*)(&(*last))));
|
memmove(&(*first), &(*last), endp - ((char*)(&(*last))));
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
|
@ -426,7 +431,9 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
~prevector() {
|
~prevector() {
|
||||||
|
if (!std::is_trivially_destructible<T>::value) {
|
||||||
clear();
|
clear();
|
||||||
|
}
|
||||||
if (!is_direct()) {
|
if (!is_direct()) {
|
||||||
free(_union.indirect);
|
free(_union.indirect);
|
||||||
_union.indirect = NULL;
|
_union.indirect = NULL;
|
||||||
|
|
Loading…
Reference in a new issue