diff --git a/repertory/librepertory/include/types/repertory.hpp b/repertory/librepertory/include/types/repertory.hpp index 0fd1ac79..d971bd65 100644 --- a/repertory/librepertory/include/types/repertory.hpp +++ b/repertory/librepertory/include/types/repertory.hpp @@ -26,11 +26,14 @@ namespace repertory { template class atomic final { public: atomic() : mtx_(std::make_shared()) {} - atomic(const atomic &) = default; + + atomic(const atomic &at_data) + : data_(static_cast(at_data)), + mtx_(std::make_shared()) {} + atomic(data_t data) : data_(std::move(data)), mtx_(std::make_shared()) {} - atomic(data_t data, std::unique_ptr mtx) - : data_(std::move(data)), mtx_(std::move(mtx)) {} + atomic(atomic &&) = default; ~atomic() = default; @@ -40,7 +43,15 @@ private: std::shared_ptr mtx_; public: - auto operator=(const atomic &) -> atomic & = default; + auto operator=(const atomic &at_data) -> atomic & { + if (&at_data == this) { + return *this; + } + + mutex_lock lock(*mtx_); + static_cast(at_data) == data_; + return *this; + } auto operator=(atomic &&) -> atomic & = default;