#pragma once

#include <cassert>
#include <mutex>
#include <optional>
#include <thread>

namespace chatterino {

// Debug-class which asserts if guard of the same object has been called from different threads
struct ThreadGuard {
#ifndef NDEBUG
    std::mutex mutex;
    std::optional<std::thread::id> threadID;
#endif

    inline void guard()
    {
#ifndef NDEBUG
        std::unique_lock lock(this->mutex);

        auto currentThreadID = std::this_thread::get_id();

        if (!this->threadID.has_value())
        {
            this->threadID = currentThreadID;
            return;
        }

        assert(this->threadID == currentThreadID);
#endif
    }
};

}  // namespace chatterino
