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