From a4b184365319a6a952738de009c63a6b27e74e78 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Fri, 12 Apr 2024 22:37:06 +0200 Subject: [PATCH] Fix skip list copy not calling copy constructor for elements --- src/kernel/templates/SkipList.hpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/kernel/templates/SkipList.hpp b/src/kernel/templates/SkipList.hpp index cf893f944..17bb6849f 100644 --- a/src/kernel/templates/SkipList.hpp +++ b/src/kernel/templates/SkipList.hpp @@ -24,23 +24,18 @@ protected: Node *before = nullptr; bool end = false; - alignas(Data) std::array data; - Data &get() { assert(!end); - return *std::launder(reinterpret_cast(&data[0])); + return *std::launder(reinterpret_cast(&_data[0])); } const Data &get() const { assert(!end); - return *std::launder(reinterpret_cast(&data[0])); + return *std::launder(reinterpret_cast(&_data[0])); } - }; - // static_assert(std::is_trivially_constructible::value); - // static_assert(std::is_trivially_destructible::value); - // static_assert(std::is_trivially_copyable::value); - // static_assert(std::is_trivially_move_assignable::value); - // static_assert(std::is_trivially_move_constructible::value); + private: + alignas(Data) std::array _data; + }; class NodeAllocator { static constexpr int size{64}; @@ -138,8 +133,8 @@ public: curL = newLevel; } - auto newNode = (Node *) nodeAllocator.get(); - newNode->data = n->data; + auto newNode = (Node *) nodeAllocator.get(); + new (&newNode->get()) Data(n->get()); newNode->before = toUpdate[0]; if (toUpdate[0]->next[0] != nullptr) toUpdate[0]->next[0]->before = newNode;