Use std::copy in Deque copy constructor
This commit is contained in:
parent
9f2d1e88dd
commit
39a6c0a2f4
28
flow/Deque.h
28
flow/Deque.h
|
@ -41,21 +41,25 @@ public:
|
|||
Deque() : arr(0), begin(0), end(0), mask(-1) {}
|
||||
|
||||
// TODO: iterator construction, other constructors
|
||||
Deque(Deque const& r) : arr(0), begin(0), end(r.size()), mask(r.mask) {
|
||||
Deque(Deque const& r) : arr(nullptr), begin(0), end(r.size()), mask(r.mask) {
|
||||
if (r.capacity() > 0) {
|
||||
arr = (T*)aligned_alloc(std::max(__alignof(T), sizeof(void*)), capacity() * sizeof(T));
|
||||
ASSERT(arr != nullptr);
|
||||
}
|
||||
ASSERT(capacity() >= end || end == 0);
|
||||
for (uint32_t i=0; i<end; i++)
|
||||
new (&arr[i]) T(r[i]);
|
||||
// FIXME: Specialization for POD types using memcpy?
|
||||
if (r.end < r.capacity()) {
|
||||
std::copy(r.arr + r.begin, r.arr + r.begin + r.size(), arr);
|
||||
} else {
|
||||
auto partOneSize = r.capacity() - r.begin;
|
||||
std::copy(r.arr + r.begin, r.arr + r.begin + partOneSize, arr);
|
||||
std::copy(r.arr, r.arr + (r.end & r.mask), arr + partOneSize);
|
||||
}
|
||||
}
|
||||
|
||||
void operator=(Deque const& r) {
|
||||
cleanup();
|
||||
|
||||
arr = 0;
|
||||
arr = nullptr;
|
||||
begin = 0;
|
||||
end = r.size();
|
||||
mask = r.mask;
|
||||
|
@ -64,13 +68,17 @@ public:
|
|||
ASSERT(arr != nullptr);
|
||||
}
|
||||
ASSERT(capacity() >= end || end == 0);
|
||||
for (uint32_t i=0; i<end; i++)
|
||||
new (&arr[i]) T(r[i]);
|
||||
// FIXME: Specialization for POD types using memcpy?
|
||||
if (r.end < r.capacity()) {
|
||||
std::copy(r.arr + r.begin, r.arr + r.begin + r.size(), arr);
|
||||
} else {
|
||||
auto partOneSize = r.capacity() - r.begin;
|
||||
std::copy(r.arr + r.begin, r.arr + r.begin + partOneSize, arr);
|
||||
std::copy(r.arr, r.arr + (r.end & r.mask), arr + partOneSize);
|
||||
}
|
||||
}
|
||||
|
||||
Deque(Deque&& r) BOOST_NOEXCEPT : begin(r.begin), end(r.end), mask(r.mask), arr(r.arr) {
|
||||
r.arr = 0;
|
||||
r.arr = nullptr;
|
||||
r.begin = r.end = 0;
|
||||
r.mask = -1;
|
||||
}
|
||||
|
@ -83,7 +91,7 @@ public:
|
|||
mask = r.mask;
|
||||
arr = r.arr;
|
||||
|
||||
r.arr = 0;
|
||||
r.arr = nullptr;
|
||||
r.begin = r.end = 0;
|
||||
r.mask = -1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue