.. _program_listing_file_src_utils_UniqueIDManager.hpp: Program Listing for File UniqueIDManager.hpp ============================================ |exhale_lsh| :ref:`Return to documentation for file ` (``src/utils/UniqueIDManager.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #ifndef UNIQUEIDMANAGER_HPP #define UNIQUEIDMANAGER_HPP #include "MPIUtils.hpp" namespace utils { class UniqueIDManager { public: UniqueIDManager() : uniqueID_(static_cast(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