98 lines
2.3 KiB
C++
98 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#include <chrono>
|
|
#include <mutex>
|
|
|
|
namespace SimCore
|
|
{
|
|
template <typename T>
|
|
class Data{
|
|
|
|
|
|
public:
|
|
|
|
Data():mx(),valid_(false),writeTime_(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count())
|
|
{
|
|
|
|
}
|
|
|
|
Data (const Data &other)
|
|
{
|
|
std::lock_guard<std::mutex> guard(other.mx);
|
|
if (typeid(other.data_) == typeid(data_))
|
|
{
|
|
data_ = other.data_;
|
|
valid_ = true;
|
|
writeTime_ = other.writeTime_;
|
|
}else
|
|
{
|
|
valid_ = false;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
Data& operator=(const Data other)
|
|
{
|
|
std::lock_guard<std::mutex> lock(other.mx);
|
|
if (typeid(other.data_) == typeid(data_))
|
|
{
|
|
this->data_ = other.data_;
|
|
this->valid_ = other.valid_;
|
|
this->writeTime_ = other.writeTime_;
|
|
}else
|
|
{
|
|
this->valid_ = false;
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
void setValue(T value)
|
|
{
|
|
std::lock_guard<std::mutex> guard(mx);
|
|
data_ = value;
|
|
valid_ = true;
|
|
writeTime_ = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
|
|
}
|
|
|
|
T getValue()
|
|
{
|
|
std::lock_guard<std::mutex> guard(mx);
|
|
return data_;
|
|
}
|
|
|
|
[[deprecated("isValid() instead")]]
|
|
bool getValidity()
|
|
{
|
|
return valid_;
|
|
}
|
|
|
|
bool isValid()
|
|
{
|
|
std::lock_guard<std::mutex> guard(mx);
|
|
return valid_;
|
|
}
|
|
|
|
std::uint64_t getWriteTime()
|
|
{
|
|
std::lock_guard<std::mutex> guard(mx);
|
|
return writeTime_;
|
|
}
|
|
private:
|
|
|
|
T data_;
|
|
|
|
bool valid_;
|
|
|
|
std::uint64_t writeTime_;
|
|
|
|
mutable std::mutex mx;
|
|
|
|
|
|
|
|
|
|
};
|
|
} // namespace SimCore
|