mirror-chatterino2/src/common/Atomic.hpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

117 lines
2 KiB
C++
Raw Normal View History

2018-05-25 13:53:55 +02:00
#pragma once
#include <atomic>
#include <memory>
2018-05-25 13:53:55 +02:00
#include <mutex>
2018-05-25 13:53:55 +02:00
namespace chatterino {
2018-05-25 13:53:55 +02:00
template <typename T>
class Atomic
2018-05-25 13:53:55 +02:00
{
public:
Atomic() = default;
~Atomic() = default;
2018-08-11 14:20:53 +02:00
Atomic(T &&val)
: value_(std::move(val))
2018-05-25 13:53:55 +02:00
{
}
Atomic(const Atomic &) = delete;
Atomic &operator=(const Atomic &) = delete;
Atomic(Atomic &&) = delete;
Atomic &operator=(Atomic &&) = delete;
2018-05-25 13:53:55 +02:00
T get() const
{
2018-07-06 17:56:11 +02:00
std::lock_guard<std::mutex> guard(this->mutex_);
2018-07-06 17:56:11 +02:00
return this->value_;
2018-05-25 13:53:55 +02:00
}
2018-05-25 13:53:55 +02:00
void set(const T &val)
{
2018-07-06 17:56:11 +02:00
std::lock_guard<std::mutex> guard(this->mutex_);
2018-07-06 17:56:11 +02:00
this->value_ = val;
2018-05-25 13:53:55 +02:00
}
2018-08-11 14:20:53 +02:00
void set(T &&val)
{
std::lock_guard<std::mutex> guard(this->mutex_);
2018-08-11 14:20:53 +02:00
this->value_ = std::move(val);
}
2018-07-06 17:56:11 +02:00
private:
mutable std::mutex mutex_;
T value_;
2018-05-25 13:53:55 +02:00
};
#if defined(__cpp_lib_atomic_shared_ptr) && defined(__cpp_concepts)
template <typename T>
class Atomic<std::shared_ptr<T>>
{
// Atomic<std::shared_ptr<T>> must be instantated with a const T
};
template <typename T>
requires std::is_const_v<T>
class Atomic<std::shared_ptr<T>>
{
public:
Atomic() = default;
~Atomic() = default;
Atomic(T &&val)
: value_(std::make_shared<T>(std::move(val)))
{
}
Atomic(std::shared_ptr<T> &&val)
: value_(std::move(val))
{
}
Atomic(const Atomic &) = delete;
Atomic &operator=(const Atomic &) = delete;
Atomic(Atomic &&) = delete;
Atomic &operator=(Atomic &&) = delete;
std::shared_ptr<T> get() const
{
return this->value_.load();
}
void set(const T &val)
{
this->value_.store(std::make_shared<T>(val));
}
void set(T &&val)
{
this->value_.store(std::make_shared<T>(std::move(val)));
}
void set(const std::shared_ptr<T> &val)
{
this->value_.store(val);
}
void set(std::shared_ptr<T> &&val)
{
this->value_.store(std::move(val));
}
private:
std::atomic<std::shared_ptr<T>> value_;
};
#endif
2018-05-25 13:53:55 +02:00
} // namespace chatterino