33 lines
1018 B
C++
33 lines
1018 B
C++
#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>;
|
|
};
|
|
class Non_Copyable {
|
|
public:
|
|
Non_Copyable(const Non_Copyable&) = delete;
|
|
Non_Copyable& operator=(const Non_Copyable&) = delete;
|
|
Non_Copyable(Non_Copyable&&) = default;
|
|
Non_Copyable& operator=(Non_Copyable&&) = default;
|
|
protected:
|
|
Non_Copyable() = default;
|
|
~Non_Copyable() = default;
|
|
};
|
|
class Non_Movable {
|
|
public:
|
|
Non_Movable(const Non_Movable&) = default;
|
|
Non_Movable& operator=(const Non_Movable&) = default;
|
|
Non_Movable(Non_Movable&&) = delete;
|
|
Non_Movable& operator=(Non_Movable&&) = delete;
|
|
protected:
|
|
Non_Movable() = default;
|
|
~Non_Movable() = default;
|
|
};
|