diff --git a/include/libcamera/class.h b/include/libcamera/class.h
index 2d9b7ebfdb08..5cd31d1b9f37 100644
--- a/include/libcamera/class.h
+++ b/include/libcamera/class.h
@@ -11,6 +11,18 @@
 
 namespace libcamera {
 
+#define LIBCAMERA_DISABLE_COPY(klass)  \
+	klass(const klass &) = delete; \
+	klass &operator=(const klass &) = delete
+
+#define LIBCAMERA_DISABLE_MOVE(klass) \
+	klass(klass &&) = delete;     \
+	klass &operator=(klass &&) = delete
+
+#define LIBCAMERA_DISABLE_COPY_AND_MOVE(klass) \
+	LIBCAMERA_DISABLE_COPY(klass);         \
+	LIBCAMERA_DISABLE_MOVE(klass)
+
 #ifndef __DOXYGEN__
 #define LIBCAMERA_DECLARE_PRIVATE(klass)				\
 public:									\
diff --git a/src/libcamera/class.cpp b/src/libcamera/class.cpp
index 8a608edb369b..b081d05ec3ac 100644
--- a/src/libcamera/class.cpp
+++ b/src/libcamera/class.cpp
@@ -17,6 +17,24 @@
 
 namespace libcamera {
 
+/**
+ * \def LIBCAMERA_DISABLE_COPY
+ * \brief Delete the copy constructor and assignment operator.
+ * \param klass The identifier of the class to modify
+ */
+
+/**
+ * \def LIBCAMERA_DISABLE_MOVE
+ * \brief Delete the move construtor and assignment operator.
+ * \param klass The identifier of the class to modify
+ */
+
+/**
+ * \def LIBCAMERA_DISABLE_COPY_AND_MOVE
+ * \brief Delete all copy and move constructors, and assignment operators.
+ * \param klass The identifier of the class to modify
+ */
+
 /**
  * \def LIBCAMERA_DECLARE_PRIVATE
  * \brief Declare private data for a public class
