Files
SimCore/include/SimCore/data.hpp
2023-08-10 17:18:36 +02:00

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