diff --git a/libs/util/include/psemek/util/polymorphic_storage.hpp b/libs/util/include/psemek/util/polymorphic_storage.hpp deleted file mode 100644 index b35e7652..00000000 --- a/libs/util/include/psemek/util/polymorphic_storage.hpp +++ /dev/null @@ -1,155 +0,0 @@ -#pragma once - -#include -#include - -namespace psemek::util -{ - - template - struct polymorhpic_storage - { - static constexpr std::size_t align = std::max(alignof(I*), alignof(I)); - static constexpr std::size_t size = std::max(sizeof(I*), std::max(sizeof(I), Size)); - - polymorhpic_storage() noexcept = default; - - polymorhpic_storage(polymorhpic_storage && other) noexcept; - polymorhpic_storage & operator = (polymorhpic_storage && other) noexcept; - - polymorhpic_storage(polymorhpic_storage const &) = delete; - polymorhpic_storage & operator = (polymorhpic_storage const &) = delete; - - template - void emplace(Args && ... args); - - I * get() const noexcept; - - void reset() noexcept; - - ~polymorhpic_storage() noexcept - { - reset(); - } - - explicit operator bool() const - { - return static_cast(manager_); - } - - private: - std::aligned_storage_t storage_; - - using manager = void*(*)(void *, void *, int); - manager manager_ = nullptr; - - static constexpr int op_get = 1; - static constexpr int op_move = 2; - static constexpr int op_destroy = 3; - }; - - template - polymorhpic_storage::polymorhpic_storage(polymorhpic_storage && other) noexcept - { - manager_ = other.manager_; - if (manager_) - { - manager_(&other.storage_, &storage_, op_move); - } - - other.reset(); - } - - template - polymorhpic_storage & polymorhpic_storage::operator = (polymorhpic_storage && other) noexcept - { - if (this == &other) - return *this; - - reset(); - manager_ = other.manager_; - if (manager_) - { - manager_(&other.storage_, &storage_, op_move); - } - - other.reset(); - return *this; - } - - template - template - void polymorhpic_storage::emplace(Args && ... args) - { - constexpr bool static_storage = true - && (sizeof(T) <= size) - && (alignof(T) <= align) - && ((align % alignof(T)) == 0) - && std::is_nothrow_move_constructible_v - ; - - reset(); - if constexpr (static_storage) - { - static_assert(sizeof(T) <= size); - new (reinterpret_cast(&storage_)) T(std::forward(args)...); - manager_ = [](void * src, void * dst, int op) -> void* - { - switch (op) - { - case op_get: - return src; - case op_move: - new (reinterpret_cast(dst)) T(std::move(*reinterpret_cast(src))); - break; - case op_destroy: - reinterpret_cast(src)->~T(); - break; - default: - break; - } - - return nullptr; - }; - } - else - { - *reinterpret_cast(&storage_) = new T(std::forward(args)...); - manager_ = [](void * src, void * dst, int op) -> void* - { - switch (op) - { - case op_get: - return *reinterpret_cast(src); - case op_move: - *reinterpret_cast(dst) = *reinterpret_cast(src); - *reinterpret_cast(src) = nullptr; - break; - case op_destroy: - delete *reinterpret_cast(src); - break; - default: - break; - } - - return nullptr; - }; - } - } - - template - I * polymorhpic_storage::get() const noexcept - { - if (!manager_) return nullptr; - return static_cast(manager_(const_cast(static_cast(&storage_)), nullptr, op_get)); - } - - template - void polymorhpic_storage::reset() noexcept - { - if (!manager_) return; - manager_(&storage_, nullptr, op_destroy); - manager_ = nullptr; - } - -}