Program Listing for File UniqueIDManager.hpp
↰ Return to documentation for file (src/utils/UniqueIDManager.hpp)
#ifndef UNIQUEIDMANAGER_HPP
#define UNIQUEIDMANAGER_HPP
#include "MPIUtils.hpp"
namespace utils {
class UniqueIDManager {
public:
UniqueIDManager() : uniqueID_(static_cast<unsigned long>(mpiRank()) * mpiUidStride) { }
~UniqueIDManager() = default;
// Disable copy and move constructors and assignment operators,
// since this class is meant to be used only via a single,
// shared instance
UniqueIDManager(const UniqueIDManager&) = delete;
UniqueIDManager(UniqueIDManager&&) = delete;
auto operator=(const UniqueIDManager&) -> UniqueIDManager& = delete;
auto operator=(UniqueIDManager&&) -> UniqueIDManager& = delete;
[[nodiscard]] auto get() -> unsigned long
{
unsigned long id{};
#ifdef _OPENMP
#pragma omp atomic capture
#endif
{ id = uniqueID_; uniqueID_++; }
return id;
}
void set(const unsigned long value)
{
#ifdef _OPENMP
#pragma omp atomic write
#endif
uniqueID_ = value;
}
[[nodiscard]] auto read() const -> unsigned long
{
unsigned long id{};
#ifdef _OPENMP
#pragma omp atomic read
#endif
id = uniqueID_;
return id;
}
private:
unsigned long uniqueID_;
};
inline auto uniqueID() -> UniqueIDManager&
{
static UniqueIDManager instance;
return instance;
}
} // namespace utils
#endif // UNIQUEIDMANAGER_HPP