mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 14:55:24 +08:00
Inheriting from NonCopyableOrMovableClass or NonCopyableClass does not prevent derived classes from accidentally defining their own copy or move constructors, violating the intended design. This commit introduces two concepts: - NonCopyableOrMovable - NonCopyable Using static asserts with these concepts will guarantee the intended copy and move limitations. Related-To: NEO-14068 Signed-off-by: Kamil Kopryk <kamil.kopryk@intel.com>
46 lines
1.2 KiB
C++
46 lines
1.2 KiB
C++
/*
|
|
* Copyright (C) 2019-2025 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <type_traits>
|
|
|
|
namespace NEO {
|
|
class NonCopyableOrMovableClass {
|
|
public:
|
|
NonCopyableOrMovableClass() = default;
|
|
NonCopyableOrMovableClass(const NonCopyableOrMovableClass &) = delete;
|
|
NonCopyableOrMovableClass &operator=(const NonCopyableOrMovableClass &) = delete;
|
|
|
|
NonCopyableOrMovableClass(NonCopyableOrMovableClass &&) = delete;
|
|
NonCopyableOrMovableClass &operator=(NonCopyableOrMovableClass &&) = delete;
|
|
};
|
|
|
|
class NonCopyableClass {
|
|
public:
|
|
NonCopyableClass() = default;
|
|
NonCopyableClass(const NonCopyableClass &) = delete;
|
|
NonCopyableClass &operator=(const NonCopyableClass &) = delete;
|
|
|
|
NonCopyableClass(NonCopyableClass &&) = default;
|
|
NonCopyableClass &operator=(NonCopyableClass &&) = default;
|
|
};
|
|
|
|
template <typename T>
|
|
concept NonCopyableOrMovable = !
|
|
std::is_copy_constructible_v<T> &&
|
|
!std::is_copy_assignable_v<T> &&
|
|
!std::is_move_constructible_v<T> &&
|
|
!std::is_move_assignable_v<T>;
|
|
|
|
template <typename T>
|
|
concept NonCopyable = !
|
|
std::is_copy_constructible_v<T> &&
|
|
!std::is_copy_assignable_v<T>;
|
|
|
|
} // namespace NEO
|