[{"id":13427,"web_url":"https://patchwork.libcamera.org/comment/13427/","msgid":"<20201023043730.GF4113@pendragon.ideasonboard.com>","date":"2020-10-23T04:37:30","subject":"Re: [libcamera-devel] [PATCH 4/5] libcamera: Utilise\n\tDELETE_COPY_AND_ASSIGN","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran,\n\nThank you for the patch.\n\nOn Thu, Oct 22, 2020 at 02:56:04PM +0100, Kieran Bingham wrote:\n> Replace existing use cases where the copy constructor and copy assignment operator\n> are deleted with the DELETE_COPY_AND_ASSIGN statement\n\nSame comments as for patch 3/5 (especially about disabling both copy and\nmove for most classes). There one more small comment below.\n\n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n>  include/libcamera/camera.h                      | 7 ++++---\n>  include/libcamera/camera_manager.h              | 5 +++--\n>  include/libcamera/controls.h                    | 7 +++----\n>  include/libcamera/framebuffer_allocator.h       | 7 ++++---\n>  include/libcamera/internal/byte_stream_buffer.h | 4 ++--\n>  include/libcamera/internal/camera_sensor.h      | 6 +++---\n>  include/libcamera/internal/file.h               | 6 +++---\n>  include/libcamera/internal/log.h                | 6 +++++-\n>  include/libcamera/internal/pipeline_handler.h   | 4 ++--\n>  include/libcamera/internal/v4l2_subdevice.h     | 5 +++--\n>  include/libcamera/internal/v4l2_videodevice.h   | 6 +++---\n>  include/libcamera/request.h                     | 5 +++--\n>  12 files changed, 38 insertions(+), 30 deletions(-)\n> \n> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> index 79ff8d6b67a4..a9b855bb4691 100644\n> --- a/include/libcamera/camera.h\n> +++ b/include/libcamera/camera.h\n> @@ -12,6 +12,7 @@\n>  #include <stdint.h>\n>  #include <string>\n>  \n> +#include <libcamera/class.h>\n>  #include <libcamera/controls.h>\n>  #include <libcamera/object.h>\n>  #include <libcamera/request.h>\n> @@ -77,9 +78,6 @@ public:\n>  \t\t\t\t\t      const std::string &id,\n>  \t\t\t\t\t      const std::set<Stream *> &streams);\n>  \n> -\tCamera(const Camera &) = delete;\n> -\tCamera &operator=(const Camera &) = delete;\n> -\n>  \tconst std::string &id() const;\n>  \n>  \tSignal<Request *, FrameBuffer *> bufferCompleted;\n> @@ -105,6 +103,9 @@ public:\n>  private:\n>  \tCamera(PipelineHandler *pipe, const std::string &id,\n>  \t       const std::set<Stream *> &streams);\n> +\n> +\tDELETE_COPY_AND_ASSIGN(Camera);\n> +\n>  \t~Camera();\n>  \n>  \tclass Private;\n> diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h\n> index 9eb2b6f5a5f5..1442c4701432 100644\n> --- a/include/libcamera/camera_manager.h\n> +++ b/include/libcamera/camera_manager.h\n> @@ -12,6 +12,7 @@\n>  #include <sys/types.h>\n>  #include <vector>\n>  \n> +#include <libcamera/class.h>\n>  #include <libcamera/object.h>\n>  #include <libcamera/signal.h>\n>  \n> @@ -24,8 +25,6 @@ class CameraManager : public Object\n>  {\n>  public:\n>  \tCameraManager();\n> -\tCameraManager(const CameraManager &) = delete;\n> -\tCameraManager &operator=(const CameraManager &) = delete;\n>  \t~CameraManager();\n>  \n>  \tint start();\n> @@ -48,6 +47,8 @@ public:\n>  \tSignal<std::shared_ptr<Camera>> cameraRemoved;\n>  \n>  private:\n> +\tDELETE_COPY_AND_ASSIGN(CameraManager);\n> +\n>  \tstatic const std::string version_;\n>  \tstatic CameraManager *self_;\n>  \n> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> index 80944efc133a..8a84170a0293 100644\n> --- a/include/libcamera/controls.h\n> +++ b/include/libcamera/controls.h\n> @@ -13,6 +13,7 @@\n>  #include <string>\n>  #include <unordered_map>\n>  \n> +#include <libcamera/class.h>\n>  #include <libcamera/geometry.h>\n>  #include <libcamera/span.h>\n>  \n> @@ -218,8 +219,7 @@ public:\n>  \tControlType type() const { return type_; }\n>  \n>  private:\n> -\tControlId &operator=(const ControlId &) = delete;\n> -\tControlId(const ControlId &) = delete;\n> +\tDELETE_COPY_AND_ASSIGN(ControlId);\n>  \n>  \tunsigned int id_;\n>  \tstd::string name_;\n> @@ -258,8 +258,7 @@ public:\n>  \t}\n>  \n>  private:\n> -\tControl(const Control &) = delete;\n> -\tControl &operator=(const Control &) = delete;\n> +\tDELETE_COPY_AND_ASSIGN(Control);\n>  };\n>  \n>  class ControlInfo\n> diff --git a/include/libcamera/framebuffer_allocator.h b/include/libcamera/framebuffer_allocator.h\n> index a96aaeae58ce..5c540f23f8d9 100644\n> --- a/include/libcamera/framebuffer_allocator.h\n> +++ b/include/libcamera/framebuffer_allocator.h\n> @@ -11,6 +11,8 @@\n>  #include <memory>\n>  #include <vector>\n>  \n> +#include <libcamera/class.h>\n> +\n>  namespace libcamera {\n>  \n>  class Camera;\n> @@ -21,9 +23,6 @@ class FrameBufferAllocator\n>  {\n>  public:\n>  \tFrameBufferAllocator(std::shared_ptr<Camera> camera);\n> -\tFrameBufferAllocator(const FrameBufferAllocator &) = delete;\n> -\tFrameBufferAllocator &operator=(const FrameBufferAllocator &) = delete;\n> -\n>  \t~FrameBufferAllocator();\n>  \n>  \tint allocate(Stream *stream);\n> @@ -33,6 +32,8 @@ public:\n>  \tconst std::vector<std::unique_ptr<FrameBuffer>> &buffers(Stream *stream) const;\n>  \n>  private:\n> +\tDELETE_COPY_AND_ASSIGN(FrameBufferAllocator);\n> +\n>  \tstd::shared_ptr<Camera> camera_;\n>  \tstd::map<Stream *, std::vector<std::unique_ptr<FrameBuffer>>> buffers_;\n>  };\n> diff --git a/include/libcamera/internal/byte_stream_buffer.h b/include/libcamera/internal/byte_stream_buffer.h\n> index db59577dc332..b38c026c8eeb 100644\n> --- a/include/libcamera/internal/byte_stream_buffer.h\n> +++ b/include/libcamera/internal/byte_stream_buffer.h\n> @@ -11,6 +11,7 @@\n>  #include <stdint.h>\n>  #include <type_traits>\n>  \n> +#include <libcamera/class.h>\n>  #include <libcamera/span.h>\n>  \n>  namespace libcamera {\n> @@ -65,8 +66,7 @@ public:\n>  \t}\n>  \n>  private:\n> -\tByteStreamBuffer(const ByteStreamBuffer &other) = delete;\n> -\tByteStreamBuffer &operator=(const ByteStreamBuffer &other) = delete;\n> +\tDELETE_COPY_AND_ASSIGN(ByteStreamBuffer);\n>  \n>  \tvoid setOverflow();\n>  \n> diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h\n> index b9eba89f00fb..f03791847af2 100644\n> --- a/include/libcamera/internal/camera_sensor.h\n> +++ b/include/libcamera/internal/camera_sensor.h\n> @@ -11,6 +11,7 @@\n>  #include <string>\n>  #include <vector>\n>  \n> +#include <libcamera/class.h>\n>  #include <libcamera/controls.h>\n>  #include <libcamera/geometry.h>\n>  \n> @@ -41,9 +42,6 @@ public:\n>  \texplicit CameraSensor(const MediaEntity *entity);\n>  \t~CameraSensor();\n>  \n> -\tCameraSensor(const CameraSensor &) = delete;\n> -\tCameraSensor &operator=(const CameraSensor &) = delete;\n> -\n>  \tint init();\n>  \n>  \tconst std::string &model() const { return model_; }\n> @@ -68,6 +66,8 @@ protected:\n>  \tstd::string logPrefix() const override;\n>  \n>  private:\n> +\tDELETE_COPY_AND_ASSIGN(CameraSensor);\n> +\n>  \tint generateId();\n>  \n>  \tconst MediaEntity *entity_;\n> diff --git a/include/libcamera/internal/file.h b/include/libcamera/internal/file.h\n> index 9b6d011f5e9d..00f8d49d3882 100644\n> --- a/include/libcamera/internal/file.h\n> +++ b/include/libcamera/internal/file.h\n> @@ -11,6 +11,7 @@\n>  #include <string>\n>  #include <sys/types.h>\n>  \n> +#include <libcamera/class.h>\n>  #include <libcamera/span.h>\n>  \n>  namespace libcamera {\n> @@ -34,9 +35,6 @@ public:\n>  \tFile();\n>  \t~File();\n>  \n> -\tFile(const File &) = delete;\n> -\tFile &operator=(const File &) = delete;\n> -\n>  \tconst std::string &fileName() const { return name_; }\n>  \tvoid setFileName(const std::string &name);\n>  \tbool exists() const;\n> @@ -62,6 +60,8 @@ public:\n>  \tstatic bool exists(const std::string &name);\n>  \n>  private:\n> +\tDELETE_COPY_AND_ASSIGN(File);\n> +\n>  \tvoid unmapAll();\n>  \n>  \tstd::string name_;\n> diff --git a/include/libcamera/internal/log.h b/include/libcamera/internal/log.h\n> index 4b10087a4718..9e312b6605d3 100644\n> --- a/include/libcamera/internal/log.h\n> +++ b/include/libcamera/internal/log.h\n> @@ -10,6 +10,8 @@\n>  #include <chrono>\n>  #include <sstream>\n>  \n> +#include <libcamera/class.h>\n> +\n>  #include \"libcamera/internal/utils.h\"\n>  \n>  namespace libcamera {\n> @@ -57,7 +59,7 @@ public:\n>  \t\t   LogSeverity severity);\n>  \tLogMessage(const char *fileName, unsigned int line,\n>  \t\t   const LogCategory &category, LogSeverity severity);\n> -\tLogMessage(const LogMessage &) = delete;\n> +\n\nYou can drop this blank line.\n\n>  \tLogMessage(LogMessage &&);\n>  \t~LogMessage();\n>  \n> @@ -70,6 +72,8 @@ public:\n>  \tconst std::string msg() const { return msgStream_.str(); }\n>  \n>  private:\n> +\tDELETE_COPY_AND_ASSIGN(LogMessage);\n> +\n>  \tvoid init(const char *fileName, unsigned int line);\n>  \n>  \tstd::ostringstream msgStream_;\n> diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h\n> index a4e1b529c461..11a57e2f63c6 100644\n> --- a/include/libcamera/internal/pipeline_handler.h\n> +++ b/include/libcamera/internal/pipeline_handler.h\n> @@ -15,6 +15,7 @@\n>  #include <sys/types.h>\n>  #include <vector>\n>  \n> +#include <libcamera/class.h>\n>  #include <libcamera/controls.h>\n>  #include <libcamera/object.h>\n>  #include <libcamera/stream.h>\n> @@ -50,8 +51,7 @@ public:\n>  \tstd::unique_ptr<IPAProxy> ipa_;\n>  \n>  private:\n> -\tCameraData(const CameraData &) = delete;\n> -\tCameraData &operator=(const CameraData &) = delete;\n> +\tDELETE_COPY_AND_ASSIGN(CameraData);\n>  };\n>  \n>  class PipelineHandler : public std::enable_shared_from_this<PipelineHandler>,\n> diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h\n> index 02ee3e914a8b..28abb9299ce9 100644\n> --- a/include/libcamera/internal/v4l2_subdevice.h\n> +++ b/include/libcamera/internal/v4l2_subdevice.h\n> @@ -10,6 +10,7 @@\n>  #include <string>\n>  #include <vector>\n>  \n> +#include <libcamera/class.h>\n>  #include <libcamera/geometry.h>\n>  \n>  #include \"libcamera/internal/formats.h\"\n> @@ -40,8 +41,6 @@ public:\n>  \t};\n>  \n>  \texplicit V4L2Subdevice(const MediaEntity *entity);\n> -\tV4L2Subdevice(const V4L2Subdevice &) = delete;\n> -\tV4L2Subdevice &operator=(const V4L2Subdevice &) = delete;\n>  \t~V4L2Subdevice();\n>  \n>  \tint open();\n> @@ -67,6 +66,8 @@ protected:\n>  \tstd::string logPrefix() const override;\n>  \n>  private:\n> +\tDELETE_COPY_AND_ASSIGN(V4L2Subdevice);\n> +\n>  \tstd::vector<unsigned int> enumPadCodes(unsigned int pad);\n>  \tstd::vector<SizeRange> enumPadSizes(unsigned int pad,\n>  \t\t\t\t\t    unsigned int code);\n> diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h\n> index 53f6a2d5515b..40d6499fce75 100644\n> --- a/include/libcamera/internal/v4l2_videodevice.h\n> +++ b/include/libcamera/internal/v4l2_videodevice.h\n> @@ -16,6 +16,7 @@\n>  #include <linux/videodev2.h>\n>  \n>  #include <libcamera/buffer.h>\n> +#include <libcamera/class.h>\n>  #include <libcamera/geometry.h>\n>  #include <libcamera/pixel_format.h>\n>  #include <libcamera/signal.h>\n> @@ -172,11 +173,8 @@ public:\n>  \n>  \texplicit V4L2VideoDevice(const std::string &deviceNode);\n>  \texplicit V4L2VideoDevice(const MediaEntity *entity);\n> -\tV4L2VideoDevice(const V4L2VideoDevice &) = delete;\n>  \t~V4L2VideoDevice();\n>  \n> -\tV4L2VideoDevice &operator=(const V4L2VideoDevice &) = delete;\n> -\n>  \tint open();\n>  \tint open(int handle, enum v4l2_buf_type type);\n>  \tvoid close();\n> @@ -219,6 +217,8 @@ protected:\n>  \tstd::string logPrefix() const override;\n>  \n>  private:\n> +\tDELETE_COPY_AND_ASSIGN(V4L2VideoDevice);\n> +\n>  \tint getFormatMeta(V4L2DeviceFormat *format);\n>  \tint trySetFormatMeta(V4L2DeviceFormat *format, bool set);\n>  \n> diff --git a/include/libcamera/request.h b/include/libcamera/request.h\n> index 655b1324bae8..4a34ecddc16a 100644\n> --- a/include/libcamera/request.h\n> +++ b/include/libcamera/request.h\n> @@ -12,6 +12,7 @@\n>  #include <stdint.h>\n>  #include <unordered_set>\n>  \n> +#include <libcamera/class.h>\n>  #include <libcamera/controls.h>\n>  #include <libcamera/signal.h>\n>  \n> @@ -39,8 +40,6 @@ public:\n>  \tusing BufferMap = std::map<const Stream *, FrameBuffer *>;\n>  \n>  \tRequest(Camera *camera, uint64_t cookie = 0);\n> -\tRequest(const Request &) = delete;\n> -\tRequest &operator=(const Request &) = delete;\n>  \t~Request();\n>  \n>  \tvoid reuse(ReuseFlag flags = Default);\n> @@ -57,6 +56,8 @@ public:\n>  \tbool hasPendingBuffers() const { return !pending_.empty(); }\n>  \n>  private:\n> +\tDELETE_COPY_AND_ASSIGN(Request);\n> +\n>  \tfriend class PipelineHandler;\n>  \n>  \tvoid complete();","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 29639C3D3C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 23 Oct 2020 04:38:19 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 96136615D4;\n\tFri, 23 Oct 2020 06:38:18 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3D0266034E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 23 Oct 2020 06:38:17 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A4F2253;\n\tFri, 23 Oct 2020 06:38:16 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"rjoc2Jln\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1603427896;\n\tbh=pkQydu//iTdriz3UWC2BVmMMFhleI0cZuWu+1Ul3qQU=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=rjoc2JlnmnfmdSmlnQKJJKRdvQ2++iO7DlGdNjkUhxuWz5dLH+l7eyaOr9d3hxNIV\n\tJzvKDBlqMu0H7FI9jzsstQC11a6X/YSYygLqOK+dP/ty9KUnzz0ItWFkxSxRqSRn13\n\tLSbPyd7bAzZ8hO2KIttpe/hKo8IRxd6nHrjdV37Q=","Date":"Fri, 23 Oct 2020 07:37:30 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20201023043730.GF4113@pendragon.ideasonboard.com>","References":"<20201022135605.614240-1-kieran.bingham@ideasonboard.com>\n\t<20201022135605.614240-5-kieran.bingham@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201022135605.614240-5-kieran.bingham@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 4/5] libcamera: Utilise\n\tDELETE_COPY_AND_ASSIGN","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13438,"web_url":"https://patchwork.libcamera.org/comment/13438/","msgid":"<759f4edb-f612-7ddc-3612-5e48ab001047@ideasonboard.com>","date":"2020-10-23T08:31:09","subject":"Re: [libcamera-devel] [PATCH 4/5] libcamera: Utilise\n\tDELETE_COPY_AND_ASSIGN","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"On 23/10/2020 05:37, Laurent Pinchart wrote:\n> Hi Kieran,\n> \n> Thank you for the patch.\n> \n> On Thu, Oct 22, 2020 at 02:56:04PM +0100, Kieran Bingham wrote:\n>> Replace existing use cases where the copy constructor and copy assignment operator\n>> are deleted with the DELETE_COPY_AND_ASSIGN statement\n> \n> Same comments as for patch 3/5 (especially about disabling both copy and\n> move for most classes). There one more small comment below.\n\nOk, so I guess that answers my question there.\n\nHowever your statement 'for most classes', and not all makes me want to\ndo that on top.\n\nIf it's all of them, then it can be squashed in this patch ... but I\ndon't want to mix and match conversions, and functional changes.\n\n--\nKieran\n\n\n> \n>> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>> ---\n>>  include/libcamera/camera.h                      | 7 ++++---\n>>  include/libcamera/camera_manager.h              | 5 +++--\n>>  include/libcamera/controls.h                    | 7 +++----\n>>  include/libcamera/framebuffer_allocator.h       | 7 ++++---\n>>  include/libcamera/internal/byte_stream_buffer.h | 4 ++--\n>>  include/libcamera/internal/camera_sensor.h      | 6 +++---\n>>  include/libcamera/internal/file.h               | 6 +++---\n>>  include/libcamera/internal/log.h                | 6 +++++-\n>>  include/libcamera/internal/pipeline_handler.h   | 4 ++--\n>>  include/libcamera/internal/v4l2_subdevice.h     | 5 +++--\n>>  include/libcamera/internal/v4l2_videodevice.h   | 6 +++---\n>>  include/libcamera/request.h                     | 5 +++--\n>>  12 files changed, 38 insertions(+), 30 deletions(-)\n>>\n>> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n>> index 79ff8d6b67a4..a9b855bb4691 100644\n>> --- a/include/libcamera/camera.h\n>> +++ b/include/libcamera/camera.h\n>> @@ -12,6 +12,7 @@\n>>  #include <stdint.h>\n>>  #include <string>\n>>  \n>> +#include <libcamera/class.h>\n>>  #include <libcamera/controls.h>\n>>  #include <libcamera/object.h>\n>>  #include <libcamera/request.h>\n>> @@ -77,9 +78,6 @@ public:\n>>  \t\t\t\t\t      const std::string &id,\n>>  \t\t\t\t\t      const std::set<Stream *> &streams);\n>>  \n>> -\tCamera(const Camera &) = delete;\n>> -\tCamera &operator=(const Camera &) = delete;\n>> -\n>>  \tconst std::string &id() const;\n>>  \n>>  \tSignal<Request *, FrameBuffer *> bufferCompleted;\n>> @@ -105,6 +103,9 @@ public:\n>>  private:\n>>  \tCamera(PipelineHandler *pipe, const std::string &id,\n>>  \t       const std::set<Stream *> &streams);\n>> +\n>> +\tDELETE_COPY_AND_ASSIGN(Camera);\n>> +\n>>  \t~Camera();\n>>  \n>>  \tclass Private;\n>> diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h\n>> index 9eb2b6f5a5f5..1442c4701432 100644\n>> --- a/include/libcamera/camera_manager.h\n>> +++ b/include/libcamera/camera_manager.h\n>> @@ -12,6 +12,7 @@\n>>  #include <sys/types.h>\n>>  #include <vector>\n>>  \n>> +#include <libcamera/class.h>\n>>  #include <libcamera/object.h>\n>>  #include <libcamera/signal.h>\n>>  \n>> @@ -24,8 +25,6 @@ class CameraManager : public Object\n>>  {\n>>  public:\n>>  \tCameraManager();\n>> -\tCameraManager(const CameraManager &) = delete;\n>> -\tCameraManager &operator=(const CameraManager &) = delete;\n>>  \t~CameraManager();\n>>  \n>>  \tint start();\n>> @@ -48,6 +47,8 @@ public:\n>>  \tSignal<std::shared_ptr<Camera>> cameraRemoved;\n>>  \n>>  private:\n>> +\tDELETE_COPY_AND_ASSIGN(CameraManager);\n>> +\n>>  \tstatic const std::string version_;\n>>  \tstatic CameraManager *self_;\n>>  \n>> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n>> index 80944efc133a..8a84170a0293 100644\n>> --- a/include/libcamera/controls.h\n>> +++ b/include/libcamera/controls.h\n>> @@ -13,6 +13,7 @@\n>>  #include <string>\n>>  #include <unordered_map>\n>>  \n>> +#include <libcamera/class.h>\n>>  #include <libcamera/geometry.h>\n>>  #include <libcamera/span.h>\n>>  \n>> @@ -218,8 +219,7 @@ public:\n>>  \tControlType type() const { return type_; }\n>>  \n>>  private:\n>> -\tControlId &operator=(const ControlId &) = delete;\n>> -\tControlId(const ControlId &) = delete;\n>> +\tDELETE_COPY_AND_ASSIGN(ControlId);\n>>  \n>>  \tunsigned int id_;\n>>  \tstd::string name_;\n>> @@ -258,8 +258,7 @@ public:\n>>  \t}\n>>  \n>>  private:\n>> -\tControl(const Control &) = delete;\n>> -\tControl &operator=(const Control &) = delete;\n>> +\tDELETE_COPY_AND_ASSIGN(Control);\n>>  };\n>>  \n>>  class ControlInfo\n>> diff --git a/include/libcamera/framebuffer_allocator.h b/include/libcamera/framebuffer_allocator.h\n>> index a96aaeae58ce..5c540f23f8d9 100644\n>> --- a/include/libcamera/framebuffer_allocator.h\n>> +++ b/include/libcamera/framebuffer_allocator.h\n>> @@ -11,6 +11,8 @@\n>>  #include <memory>\n>>  #include <vector>\n>>  \n>> +#include <libcamera/class.h>\n>> +\n>>  namespace libcamera {\n>>  \n>>  class Camera;\n>> @@ -21,9 +23,6 @@ class FrameBufferAllocator\n>>  {\n>>  public:\n>>  \tFrameBufferAllocator(std::shared_ptr<Camera> camera);\n>> -\tFrameBufferAllocator(const FrameBufferAllocator &) = delete;\n>> -\tFrameBufferAllocator &operator=(const FrameBufferAllocator &) = delete;\n>> -\n>>  \t~FrameBufferAllocator();\n>>  \n>>  \tint allocate(Stream *stream);\n>> @@ -33,6 +32,8 @@ public:\n>>  \tconst std::vector<std::unique_ptr<FrameBuffer>> &buffers(Stream *stream) const;\n>>  \n>>  private:\n>> +\tDELETE_COPY_AND_ASSIGN(FrameBufferAllocator);\n>> +\n>>  \tstd::shared_ptr<Camera> camera_;\n>>  \tstd::map<Stream *, std::vector<std::unique_ptr<FrameBuffer>>> buffers_;\n>>  };\n>> diff --git a/include/libcamera/internal/byte_stream_buffer.h b/include/libcamera/internal/byte_stream_buffer.h\n>> index db59577dc332..b38c026c8eeb 100644\n>> --- a/include/libcamera/internal/byte_stream_buffer.h\n>> +++ b/include/libcamera/internal/byte_stream_buffer.h\n>> @@ -11,6 +11,7 @@\n>>  #include <stdint.h>\n>>  #include <type_traits>\n>>  \n>> +#include <libcamera/class.h>\n>>  #include <libcamera/span.h>\n>>  \n>>  namespace libcamera {\n>> @@ -65,8 +66,7 @@ public:\n>>  \t}\n>>  \n>>  private:\n>> -\tByteStreamBuffer(const ByteStreamBuffer &other) = delete;\n>> -\tByteStreamBuffer &operator=(const ByteStreamBuffer &other) = delete;\n>> +\tDELETE_COPY_AND_ASSIGN(ByteStreamBuffer);\n>>  \n>>  \tvoid setOverflow();\n>>  \n>> diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h\n>> index b9eba89f00fb..f03791847af2 100644\n>> --- a/include/libcamera/internal/camera_sensor.h\n>> +++ b/include/libcamera/internal/camera_sensor.h\n>> @@ -11,6 +11,7 @@\n>>  #include <string>\n>>  #include <vector>\n>>  \n>> +#include <libcamera/class.h>\n>>  #include <libcamera/controls.h>\n>>  #include <libcamera/geometry.h>\n>>  \n>> @@ -41,9 +42,6 @@ public:\n>>  \texplicit CameraSensor(const MediaEntity *entity);\n>>  \t~CameraSensor();\n>>  \n>> -\tCameraSensor(const CameraSensor &) = delete;\n>> -\tCameraSensor &operator=(const CameraSensor &) = delete;\n>> -\n>>  \tint init();\n>>  \n>>  \tconst std::string &model() const { return model_; }\n>> @@ -68,6 +66,8 @@ protected:\n>>  \tstd::string logPrefix() const override;\n>>  \n>>  private:\n>> +\tDELETE_COPY_AND_ASSIGN(CameraSensor);\n>> +\n>>  \tint generateId();\n>>  \n>>  \tconst MediaEntity *entity_;\n>> diff --git a/include/libcamera/internal/file.h b/include/libcamera/internal/file.h\n>> index 9b6d011f5e9d..00f8d49d3882 100644\n>> --- a/include/libcamera/internal/file.h\n>> +++ b/include/libcamera/internal/file.h\n>> @@ -11,6 +11,7 @@\n>>  #include <string>\n>>  #include <sys/types.h>\n>>  \n>> +#include <libcamera/class.h>\n>>  #include <libcamera/span.h>\n>>  \n>>  namespace libcamera {\n>> @@ -34,9 +35,6 @@ public:\n>>  \tFile();\n>>  \t~File();\n>>  \n>> -\tFile(const File &) = delete;\n>> -\tFile &operator=(const File &) = delete;\n>> -\n>>  \tconst std::string &fileName() const { return name_; }\n>>  \tvoid setFileName(const std::string &name);\n>>  \tbool exists() const;\n>> @@ -62,6 +60,8 @@ public:\n>>  \tstatic bool exists(const std::string &name);\n>>  \n>>  private:\n>> +\tDELETE_COPY_AND_ASSIGN(File);\n>> +\n>>  \tvoid unmapAll();\n>>  \n>>  \tstd::string name_;\n>> diff --git a/include/libcamera/internal/log.h b/include/libcamera/internal/log.h\n>> index 4b10087a4718..9e312b6605d3 100644\n>> --- a/include/libcamera/internal/log.h\n>> +++ b/include/libcamera/internal/log.h\n>> @@ -10,6 +10,8 @@\n>>  #include <chrono>\n>>  #include <sstream>\n>>  \n>> +#include <libcamera/class.h>\n>> +\n>>  #include \"libcamera/internal/utils.h\"\n>>  \n>>  namespace libcamera {\n>> @@ -57,7 +59,7 @@ public:\n>>  \t\t   LogSeverity severity);\n>>  \tLogMessage(const char *fileName, unsigned int line,\n>>  \t\t   const LogCategory &category, LogSeverity severity);\n>> -\tLogMessage(const LogMessage &) = delete;\n>> +\n> \n> You can drop this blank line.\n> \n>>  \tLogMessage(LogMessage &&);\n>>  \t~LogMessage();\n>>  \n>> @@ -70,6 +72,8 @@ public:\n>>  \tconst std::string msg() const { return msgStream_.str(); }\n>>  \n>>  private:\n>> +\tDELETE_COPY_AND_ASSIGN(LogMessage);\n>> +\n>>  \tvoid init(const char *fileName, unsigned int line);\n>>  \n>>  \tstd::ostringstream msgStream_;\n>> diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h\n>> index a4e1b529c461..11a57e2f63c6 100644\n>> --- a/include/libcamera/internal/pipeline_handler.h\n>> +++ b/include/libcamera/internal/pipeline_handler.h\n>> @@ -15,6 +15,7 @@\n>>  #include <sys/types.h>\n>>  #include <vector>\n>>  \n>> +#include <libcamera/class.h>\n>>  #include <libcamera/controls.h>\n>>  #include <libcamera/object.h>\n>>  #include <libcamera/stream.h>\n>> @@ -50,8 +51,7 @@ public:\n>>  \tstd::unique_ptr<IPAProxy> ipa_;\n>>  \n>>  private:\n>> -\tCameraData(const CameraData &) = delete;\n>> -\tCameraData &operator=(const CameraData &) = delete;\n>> +\tDELETE_COPY_AND_ASSIGN(CameraData);\n>>  };\n>>  \n>>  class PipelineHandler : public std::enable_shared_from_this<PipelineHandler>,\n>> diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h\n>> index 02ee3e914a8b..28abb9299ce9 100644\n>> --- a/include/libcamera/internal/v4l2_subdevice.h\n>> +++ b/include/libcamera/internal/v4l2_subdevice.h\n>> @@ -10,6 +10,7 @@\n>>  #include <string>\n>>  #include <vector>\n>>  \n>> +#include <libcamera/class.h>\n>>  #include <libcamera/geometry.h>\n>>  \n>>  #include \"libcamera/internal/formats.h\"\n>> @@ -40,8 +41,6 @@ public:\n>>  \t};\n>>  \n>>  \texplicit V4L2Subdevice(const MediaEntity *entity);\n>> -\tV4L2Subdevice(const V4L2Subdevice &) = delete;\n>> -\tV4L2Subdevice &operator=(const V4L2Subdevice &) = delete;\n>>  \t~V4L2Subdevice();\n>>  \n>>  \tint open();\n>> @@ -67,6 +66,8 @@ protected:\n>>  \tstd::string logPrefix() const override;\n>>  \n>>  private:\n>> +\tDELETE_COPY_AND_ASSIGN(V4L2Subdevice);\n>> +\n>>  \tstd::vector<unsigned int> enumPadCodes(unsigned int pad);\n>>  \tstd::vector<SizeRange> enumPadSizes(unsigned int pad,\n>>  \t\t\t\t\t    unsigned int code);\n>> diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h\n>> index 53f6a2d5515b..40d6499fce75 100644\n>> --- a/include/libcamera/internal/v4l2_videodevice.h\n>> +++ b/include/libcamera/internal/v4l2_videodevice.h\n>> @@ -16,6 +16,7 @@\n>>  #include <linux/videodev2.h>\n>>  \n>>  #include <libcamera/buffer.h>\n>> +#include <libcamera/class.h>\n>>  #include <libcamera/geometry.h>\n>>  #include <libcamera/pixel_format.h>\n>>  #include <libcamera/signal.h>\n>> @@ -172,11 +173,8 @@ public:\n>>  \n>>  \texplicit V4L2VideoDevice(const std::string &deviceNode);\n>>  \texplicit V4L2VideoDevice(const MediaEntity *entity);\n>> -\tV4L2VideoDevice(const V4L2VideoDevice &) = delete;\n>>  \t~V4L2VideoDevice();\n>>  \n>> -\tV4L2VideoDevice &operator=(const V4L2VideoDevice &) = delete;\n>> -\n>>  \tint open();\n>>  \tint open(int handle, enum v4l2_buf_type type);\n>>  \tvoid close();\n>> @@ -219,6 +217,8 @@ protected:\n>>  \tstd::string logPrefix() const override;\n>>  \n>>  private:\n>> +\tDELETE_COPY_AND_ASSIGN(V4L2VideoDevice);\n>> +\n>>  \tint getFormatMeta(V4L2DeviceFormat *format);\n>>  \tint trySetFormatMeta(V4L2DeviceFormat *format, bool set);\n>>  \n>> diff --git a/include/libcamera/request.h b/include/libcamera/request.h\n>> index 655b1324bae8..4a34ecddc16a 100644\n>> --- a/include/libcamera/request.h\n>> +++ b/include/libcamera/request.h\n>> @@ -12,6 +12,7 @@\n>>  #include <stdint.h>\n>>  #include <unordered_set>\n>>  \n>> +#include <libcamera/class.h>\n>>  #include <libcamera/controls.h>\n>>  #include <libcamera/signal.h>\n>>  \n>> @@ -39,8 +40,6 @@ public:\n>>  \tusing BufferMap = std::map<const Stream *, FrameBuffer *>;\n>>  \n>>  \tRequest(Camera *camera, uint64_t cookie = 0);\n>> -\tRequest(const Request &) = delete;\n>> -\tRequest &operator=(const Request &) = delete;\n>>  \t~Request();\n>>  \n>>  \tvoid reuse(ReuseFlag flags = Default);\n>> @@ -57,6 +56,8 @@ public:\n>>  \tbool hasPendingBuffers() const { return !pending_.empty(); }\n>>  \n>>  private:\n>> +\tDELETE_COPY_AND_ASSIGN(Request);\n>> +\n>>  \tfriend class PipelineHandler;\n>>  \n>>  \tvoid complete();\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id D8EA8C3D3C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 23 Oct 2020 08:31:14 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 59771615D4;\n\tFri, 23 Oct 2020 10:31:14 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id F19DD60350\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 23 Oct 2020 10:31:12 +0200 (CEST)","from [192.168.0.20]\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 1746BB26;\n\tFri, 23 Oct 2020 10:31:11 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"FpXp+xxO\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1603441872;\n\tbh=6OfIbmNE9D3Kc3FYSJJ+Rh8N4hWCsgAXMX2ebKSU0+Y=;\n\th=Reply-To:Subject:To:Cc:References:From:Date:In-Reply-To:From;\n\tb=FpXp+xxO1CsF4rUC87pLt7m9/Q+0Apld1Rtu6+u1z09hApqLdmwV9AnU6rE8OwmE1\n\tBmzpe/Dhx7DfDq0PWdERtpxx8J0lA/D98NJnKjUH5Ys/kzCUcoeZBMUKMzQtPLWR25\n\tHW0KqUlDcKCNNcES5oIMThdCingxojwUccYxS240=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","References":"<20201022135605.614240-1-kieran.bingham@ideasonboard.com>\n\t<20201022135605.614240-5-kieran.bingham@ideasonboard.com>\n\t<20201023043730.GF4113@pendragon.ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<759f4edb-f612-7ddc-3612-5e48ab001047@ideasonboard.com>","Date":"Fri, 23 Oct 2020 09:31:09 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.10.0","MIME-Version":"1.0","In-Reply-To":"<20201023043730.GF4113@pendragon.ideasonboard.com>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH 4/5] libcamera: Utilise\n\tDELETE_COPY_AND_ASSIGN","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Reply-To":"kieran.bingham@ideasonboard.com","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13449,"web_url":"https://patchwork.libcamera.org/comment/13449/","msgid":"<20201023182741.GN4113@pendragon.ideasonboard.com>","date":"2020-10-23T18:27:41","subject":"Re: [libcamera-devel] [PATCH 4/5] libcamera: Utilise\n\tDELETE_COPY_AND_ASSIGN","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran,\n\nOn Fri, Oct 23, 2020 at 09:31:09AM +0100, Kieran Bingham wrote:\n> On 23/10/2020 05:37, Laurent Pinchart wrote:\n> > On Thu, Oct 22, 2020 at 02:56:04PM +0100, Kieran Bingham wrote:\n> >> Replace existing use cases where the copy constructor and copy assignment operator\n> >> are deleted with the DELETE_COPY_AND_ASSIGN statement\n> > \n> > Same comments as for patch 3/5 (especially about disabling both copy and\n> > move for most classes). There one more small comment below.\n> \n> Ok, so I guess that answers my question there.\n> \n> However your statement 'for most classes', and not all makes me want to\n> do that on top.\n> \n> If it's all of them, then it can be squashed in this patch ... but I\n> don't want to mix and match conversions, and functional changes.\n\nAs replied in a separate e-mail, I'm fine doing it on top (I agree it's\nbest), but with a bonus point if it was in the same series otherwise\nwe'll likely forget about it. I can help if needed.\n\n> >> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> >> ---\n> >>  include/libcamera/camera.h                      | 7 ++++---\n> >>  include/libcamera/camera_manager.h              | 5 +++--\n> >>  include/libcamera/controls.h                    | 7 +++----\n> >>  include/libcamera/framebuffer_allocator.h       | 7 ++++---\n> >>  include/libcamera/internal/byte_stream_buffer.h | 4 ++--\n> >>  include/libcamera/internal/camera_sensor.h      | 6 +++---\n> >>  include/libcamera/internal/file.h               | 6 +++---\n> >>  include/libcamera/internal/log.h                | 6 +++++-\n> >>  include/libcamera/internal/pipeline_handler.h   | 4 ++--\n> >>  include/libcamera/internal/v4l2_subdevice.h     | 5 +++--\n> >>  include/libcamera/internal/v4l2_videodevice.h   | 6 +++---\n> >>  include/libcamera/request.h                     | 5 +++--\n> >>  12 files changed, 38 insertions(+), 30 deletions(-)\n> >>\n> >> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> >> index 79ff8d6b67a4..a9b855bb4691 100644\n> >> --- a/include/libcamera/camera.h\n> >> +++ b/include/libcamera/camera.h\n> >> @@ -12,6 +12,7 @@\n> >>  #include <stdint.h>\n> >>  #include <string>\n> >>  \n> >> +#include <libcamera/class.h>\n> >>  #include <libcamera/controls.h>\n> >>  #include <libcamera/object.h>\n> >>  #include <libcamera/request.h>\n> >> @@ -77,9 +78,6 @@ public:\n> >>  \t\t\t\t\t      const std::string &id,\n> >>  \t\t\t\t\t      const std::set<Stream *> &streams);\n> >>  \n> >> -\tCamera(const Camera &) = delete;\n> >> -\tCamera &operator=(const Camera &) = delete;\n> >> -\n> >>  \tconst std::string &id() const;\n> >>  \n> >>  \tSignal<Request *, FrameBuffer *> bufferCompleted;\n> >> @@ -105,6 +103,9 @@ public:\n> >>  private:\n> >>  \tCamera(PipelineHandler *pipe, const std::string &id,\n> >>  \t       const std::set<Stream *> &streams);\n> >> +\n> >> +\tDELETE_COPY_AND_ASSIGN(Camera);\n> >> +\n> >>  \t~Camera();\n> >>  \n> >>  \tclass Private;\n> >> diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h\n> >> index 9eb2b6f5a5f5..1442c4701432 100644\n> >> --- a/include/libcamera/camera_manager.h\n> >> +++ b/include/libcamera/camera_manager.h\n> >> @@ -12,6 +12,7 @@\n> >>  #include <sys/types.h>\n> >>  #include <vector>\n> >>  \n> >> +#include <libcamera/class.h>\n> >>  #include <libcamera/object.h>\n> >>  #include <libcamera/signal.h>\n> >>  \n> >> @@ -24,8 +25,6 @@ class CameraManager : public Object\n> >>  {\n> >>  public:\n> >>  \tCameraManager();\n> >> -\tCameraManager(const CameraManager &) = delete;\n> >> -\tCameraManager &operator=(const CameraManager &) = delete;\n> >>  \t~CameraManager();\n> >>  \n> >>  \tint start();\n> >> @@ -48,6 +47,8 @@ public:\n> >>  \tSignal<std::shared_ptr<Camera>> cameraRemoved;\n> >>  \n> >>  private:\n> >> +\tDELETE_COPY_AND_ASSIGN(CameraManager);\n> >> +\n> >>  \tstatic const std::string version_;\n> >>  \tstatic CameraManager *self_;\n> >>  \n> >> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> >> index 80944efc133a..8a84170a0293 100644\n> >> --- a/include/libcamera/controls.h\n> >> +++ b/include/libcamera/controls.h\n> >> @@ -13,6 +13,7 @@\n> >>  #include <string>\n> >>  #include <unordered_map>\n> >>  \n> >> +#include <libcamera/class.h>\n> >>  #include <libcamera/geometry.h>\n> >>  #include <libcamera/span.h>\n> >>  \n> >> @@ -218,8 +219,7 @@ public:\n> >>  \tControlType type() const { return type_; }\n> >>  \n> >>  private:\n> >> -\tControlId &operator=(const ControlId &) = delete;\n> >> -\tControlId(const ControlId &) = delete;\n> >> +\tDELETE_COPY_AND_ASSIGN(ControlId);\n> >>  \n> >>  \tunsigned int id_;\n> >>  \tstd::string name_;\n> >> @@ -258,8 +258,7 @@ public:\n> >>  \t}\n> >>  \n> >>  private:\n> >> -\tControl(const Control &) = delete;\n> >> -\tControl &operator=(const Control &) = delete;\n> >> +\tDELETE_COPY_AND_ASSIGN(Control);\n> >>  };\n> >>  \n> >>  class ControlInfo\n> >> diff --git a/include/libcamera/framebuffer_allocator.h b/include/libcamera/framebuffer_allocator.h\n> >> index a96aaeae58ce..5c540f23f8d9 100644\n> >> --- a/include/libcamera/framebuffer_allocator.h\n> >> +++ b/include/libcamera/framebuffer_allocator.h\n> >> @@ -11,6 +11,8 @@\n> >>  #include <memory>\n> >>  #include <vector>\n> >>  \n> >> +#include <libcamera/class.h>\n> >> +\n> >>  namespace libcamera {\n> >>  \n> >>  class Camera;\n> >> @@ -21,9 +23,6 @@ class FrameBufferAllocator\n> >>  {\n> >>  public:\n> >>  \tFrameBufferAllocator(std::shared_ptr<Camera> camera);\n> >> -\tFrameBufferAllocator(const FrameBufferAllocator &) = delete;\n> >> -\tFrameBufferAllocator &operator=(const FrameBufferAllocator &) = delete;\n> >> -\n> >>  \t~FrameBufferAllocator();\n> >>  \n> >>  \tint allocate(Stream *stream);\n> >> @@ -33,6 +32,8 @@ public:\n> >>  \tconst std::vector<std::unique_ptr<FrameBuffer>> &buffers(Stream *stream) const;\n> >>  \n> >>  private:\n> >> +\tDELETE_COPY_AND_ASSIGN(FrameBufferAllocator);\n> >> +\n> >>  \tstd::shared_ptr<Camera> camera_;\n> >>  \tstd::map<Stream *, std::vector<std::unique_ptr<FrameBuffer>>> buffers_;\n> >>  };\n> >> diff --git a/include/libcamera/internal/byte_stream_buffer.h b/include/libcamera/internal/byte_stream_buffer.h\n> >> index db59577dc332..b38c026c8eeb 100644\n> >> --- a/include/libcamera/internal/byte_stream_buffer.h\n> >> +++ b/include/libcamera/internal/byte_stream_buffer.h\n> >> @@ -11,6 +11,7 @@\n> >>  #include <stdint.h>\n> >>  #include <type_traits>\n> >>  \n> >> +#include <libcamera/class.h>\n> >>  #include <libcamera/span.h>\n> >>  \n> >>  namespace libcamera {\n> >> @@ -65,8 +66,7 @@ public:\n> >>  \t}\n> >>  \n> >>  private:\n> >> -\tByteStreamBuffer(const ByteStreamBuffer &other) = delete;\n> >> -\tByteStreamBuffer &operator=(const ByteStreamBuffer &other) = delete;\n> >> +\tDELETE_COPY_AND_ASSIGN(ByteStreamBuffer);\n> >>  \n> >>  \tvoid setOverflow();\n> >>  \n> >> diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h\n> >> index b9eba89f00fb..f03791847af2 100644\n> >> --- a/include/libcamera/internal/camera_sensor.h\n> >> +++ b/include/libcamera/internal/camera_sensor.h\n> >> @@ -11,6 +11,7 @@\n> >>  #include <string>\n> >>  #include <vector>\n> >>  \n> >> +#include <libcamera/class.h>\n> >>  #include <libcamera/controls.h>\n> >>  #include <libcamera/geometry.h>\n> >>  \n> >> @@ -41,9 +42,6 @@ public:\n> >>  \texplicit CameraSensor(const MediaEntity *entity);\n> >>  \t~CameraSensor();\n> >>  \n> >> -\tCameraSensor(const CameraSensor &) = delete;\n> >> -\tCameraSensor &operator=(const CameraSensor &) = delete;\n> >> -\n> >>  \tint init();\n> >>  \n> >>  \tconst std::string &model() const { return model_; }\n> >> @@ -68,6 +66,8 @@ protected:\n> >>  \tstd::string logPrefix() const override;\n> >>  \n> >>  private:\n> >> +\tDELETE_COPY_AND_ASSIGN(CameraSensor);\n> >> +\n> >>  \tint generateId();\n> >>  \n> >>  \tconst MediaEntity *entity_;\n> >> diff --git a/include/libcamera/internal/file.h b/include/libcamera/internal/file.h\n> >> index 9b6d011f5e9d..00f8d49d3882 100644\n> >> --- a/include/libcamera/internal/file.h\n> >> +++ b/include/libcamera/internal/file.h\n> >> @@ -11,6 +11,7 @@\n> >>  #include <string>\n> >>  #include <sys/types.h>\n> >>  \n> >> +#include <libcamera/class.h>\n> >>  #include <libcamera/span.h>\n> >>  \n> >>  namespace libcamera {\n> >> @@ -34,9 +35,6 @@ public:\n> >>  \tFile();\n> >>  \t~File();\n> >>  \n> >> -\tFile(const File &) = delete;\n> >> -\tFile &operator=(const File &) = delete;\n> >> -\n> >>  \tconst std::string &fileName() const { return name_; }\n> >>  \tvoid setFileName(const std::string &name);\n> >>  \tbool exists() const;\n> >> @@ -62,6 +60,8 @@ public:\n> >>  \tstatic bool exists(const std::string &name);\n> >>  \n> >>  private:\n> >> +\tDELETE_COPY_AND_ASSIGN(File);\n> >> +\n> >>  \tvoid unmapAll();\n> >>  \n> >>  \tstd::string name_;\n> >> diff --git a/include/libcamera/internal/log.h b/include/libcamera/internal/log.h\n> >> index 4b10087a4718..9e312b6605d3 100644\n> >> --- a/include/libcamera/internal/log.h\n> >> +++ b/include/libcamera/internal/log.h\n> >> @@ -10,6 +10,8 @@\n> >>  #include <chrono>\n> >>  #include <sstream>\n> >>  \n> >> +#include <libcamera/class.h>\n> >> +\n> >>  #include \"libcamera/internal/utils.h\"\n> >>  \n> >>  namespace libcamera {\n> >> @@ -57,7 +59,7 @@ public:\n> >>  \t\t   LogSeverity severity);\n> >>  \tLogMessage(const char *fileName, unsigned int line,\n> >>  \t\t   const LogCategory &category, LogSeverity severity);\n> >> -\tLogMessage(const LogMessage &) = delete;\n> >> +\n> > \n> > You can drop this blank line.\n> > \n> >>  \tLogMessage(LogMessage &&);\n> >>  \t~LogMessage();\n> >>  \n> >> @@ -70,6 +72,8 @@ public:\n> >>  \tconst std::string msg() const { return msgStream_.str(); }\n> >>  \n> >>  private:\n> >> +\tDELETE_COPY_AND_ASSIGN(LogMessage);\n> >> +\n> >>  \tvoid init(const char *fileName, unsigned int line);\n> >>  \n> >>  \tstd::ostringstream msgStream_;\n> >> diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h\n> >> index a4e1b529c461..11a57e2f63c6 100644\n> >> --- a/include/libcamera/internal/pipeline_handler.h\n> >> +++ b/include/libcamera/internal/pipeline_handler.h\n> >> @@ -15,6 +15,7 @@\n> >>  #include <sys/types.h>\n> >>  #include <vector>\n> >>  \n> >> +#include <libcamera/class.h>\n> >>  #include <libcamera/controls.h>\n> >>  #include <libcamera/object.h>\n> >>  #include <libcamera/stream.h>\n> >> @@ -50,8 +51,7 @@ public:\n> >>  \tstd::unique_ptr<IPAProxy> ipa_;\n> >>  \n> >>  private:\n> >> -\tCameraData(const CameraData &) = delete;\n> >> -\tCameraData &operator=(const CameraData &) = delete;\n> >> +\tDELETE_COPY_AND_ASSIGN(CameraData);\n> >>  };\n> >>  \n> >>  class PipelineHandler : public std::enable_shared_from_this<PipelineHandler>,\n> >> diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h\n> >> index 02ee3e914a8b..28abb9299ce9 100644\n> >> --- a/include/libcamera/internal/v4l2_subdevice.h\n> >> +++ b/include/libcamera/internal/v4l2_subdevice.h\n> >> @@ -10,6 +10,7 @@\n> >>  #include <string>\n> >>  #include <vector>\n> >>  \n> >> +#include <libcamera/class.h>\n> >>  #include <libcamera/geometry.h>\n> >>  \n> >>  #include \"libcamera/internal/formats.h\"\n> >> @@ -40,8 +41,6 @@ public:\n> >>  \t};\n> >>  \n> >>  \texplicit V4L2Subdevice(const MediaEntity *entity);\n> >> -\tV4L2Subdevice(const V4L2Subdevice &) = delete;\n> >> -\tV4L2Subdevice &operator=(const V4L2Subdevice &) = delete;\n> >>  \t~V4L2Subdevice();\n> >>  \n> >>  \tint open();\n> >> @@ -67,6 +66,8 @@ protected:\n> >>  \tstd::string logPrefix() const override;\n> >>  \n> >>  private:\n> >> +\tDELETE_COPY_AND_ASSIGN(V4L2Subdevice);\n> >> +\n> >>  \tstd::vector<unsigned int> enumPadCodes(unsigned int pad);\n> >>  \tstd::vector<SizeRange> enumPadSizes(unsigned int pad,\n> >>  \t\t\t\t\t    unsigned int code);\n> >> diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h\n> >> index 53f6a2d5515b..40d6499fce75 100644\n> >> --- a/include/libcamera/internal/v4l2_videodevice.h\n> >> +++ b/include/libcamera/internal/v4l2_videodevice.h\n> >> @@ -16,6 +16,7 @@\n> >>  #include <linux/videodev2.h>\n> >>  \n> >>  #include <libcamera/buffer.h>\n> >> +#include <libcamera/class.h>\n> >>  #include <libcamera/geometry.h>\n> >>  #include <libcamera/pixel_format.h>\n> >>  #include <libcamera/signal.h>\n> >> @@ -172,11 +173,8 @@ public:\n> >>  \n> >>  \texplicit V4L2VideoDevice(const std::string &deviceNode);\n> >>  \texplicit V4L2VideoDevice(const MediaEntity *entity);\n> >> -\tV4L2VideoDevice(const V4L2VideoDevice &) = delete;\n> >>  \t~V4L2VideoDevice();\n> >>  \n> >> -\tV4L2VideoDevice &operator=(const V4L2VideoDevice &) = delete;\n> >> -\n> >>  \tint open();\n> >>  \tint open(int handle, enum v4l2_buf_type type);\n> >>  \tvoid close();\n> >> @@ -219,6 +217,8 @@ protected:\n> >>  \tstd::string logPrefix() const override;\n> >>  \n> >>  private:\n> >> +\tDELETE_COPY_AND_ASSIGN(V4L2VideoDevice);\n> >> +\n> >>  \tint getFormatMeta(V4L2DeviceFormat *format);\n> >>  \tint trySetFormatMeta(V4L2DeviceFormat *format, bool set);\n> >>  \n> >> diff --git a/include/libcamera/request.h b/include/libcamera/request.h\n> >> index 655b1324bae8..4a34ecddc16a 100644\n> >> --- a/include/libcamera/request.h\n> >> +++ b/include/libcamera/request.h\n> >> @@ -12,6 +12,7 @@\n> >>  #include <stdint.h>\n> >>  #include <unordered_set>\n> >>  \n> >> +#include <libcamera/class.h>\n> >>  #include <libcamera/controls.h>\n> >>  #include <libcamera/signal.h>\n> >>  \n> >> @@ -39,8 +40,6 @@ public:\n> >>  \tusing BufferMap = std::map<const Stream *, FrameBuffer *>;\n> >>  \n> >>  \tRequest(Camera *camera, uint64_t cookie = 0);\n> >> -\tRequest(const Request &) = delete;\n> >> -\tRequest &operator=(const Request &) = delete;\n> >>  \t~Request();\n> >>  \n> >>  \tvoid reuse(ReuseFlag flags = Default);\n> >> @@ -57,6 +56,8 @@ public:\n> >>  \tbool hasPendingBuffers() const { return !pending_.empty(); }\n> >>  \n> >>  private:\n> >> +\tDELETE_COPY_AND_ASSIGN(Request);\n> >> +\n> >>  \tfriend class PipelineHandler;\n> >>  \n> >>  \tvoid complete();","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 2E34CBDB13\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 23 Oct 2020 18:28:29 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F01BA615EA;\n\tFri, 23 Oct 2020 20:28:28 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1A1C060350\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 23 Oct 2020 20:28:28 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 9B1CFB26;\n\tFri, 23 Oct 2020 20:28:27 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"M4iakSTY\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1603477707;\n\tbh=8VvCSpIKDPp1E51a2Ny0jwQJIEt5VQhzH2FkqfoSLEQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=M4iakSTYy5mZFlCblggouyz6RdunEYPva5CVc+ejf440ZTF6ZZ1J5oTudwQOMZE+w\n\tngio7gqdegS3pHHK7BeXs0RYecZ1qkthcw5K3TxR6Nf/PRsdOt7pcIsMzflSbhJcB1\n\tuDX6HEiYliO75rR2Adjz/oMO3lyQUDcCh6gSVBdk=","Date":"Fri, 23 Oct 2020 21:27:41 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20201023182741.GN4113@pendragon.ideasonboard.com>","References":"<20201022135605.614240-1-kieran.bingham@ideasonboard.com>\n\t<20201022135605.614240-5-kieran.bingham@ideasonboard.com>\n\t<20201023043730.GF4113@pendragon.ideasonboard.com>\n\t<759f4edb-f612-7ddc-3612-5e48ab001047@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<759f4edb-f612-7ddc-3612-5e48ab001047@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 4/5] libcamera: Utilise\n\tDELETE_COPY_AND_ASSIGN","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]