#pragma once
#include <concepts>
#include <type_traits>
template <class That>
concept Class_Type = std::is_class_v<That>;
template <class That>
concept Derivable_Type = Class_Type<That> && !std::is_final_v<That>;
template <class That>
concept Mutex_Type = std::default_initializable<That> && requires(That& mutex) {
    { mutex.lock() } -> std::same_as<void>;
    { mutex.unlock() } -> std::same_as<void>;
};
