Files
compute-runtime/shared/source/helpers/non_copyable_or_moveable.h
Kamil Kopryk 899abf3aac feature: add NonCopyableOrMovable and NonCopyable concepts
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>
2025-02-14 03:55:50 +01:00

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