[libcamera-devel] [PATCH 3/5] libcamera: media_object: Utilise DELETE_COPY_AND_ASSIGN

Kieran Bingham kieran.bingham at ideasonboard.com
Fri Oct 23 10:27:10 CEST 2020


Hi Laurent,

On 23/10/2020 05:33, Laurent Pinchart wrote:
> On Fri, Oct 23, 2020 at 07:29:14AM +0300, Laurent Pinchart wrote:
>> Hi Kieran,
>>
>> Thank you for the patch.
>>
>> On Thu, Oct 22, 2020 at 02:56:03PM +0100, Kieran Bingham wrote:
>>> Convert MediaLink, MediaPad, and MediaEntity to declare DELETE_COPY_AND_ASSIGN.
>>> These classes already deleted their copy constructor but not the assignment operator.
>>>
>>> Utilising the DELETE_COPY_AND_ASSIGN prevents all copying of these classes.
>>
>> Line wrap ?
>>
>>> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>>> ---
>>>  include/libcamera/internal/media_object.h | 8 +++++---
>>>  1 file changed, 5 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/include/libcamera/internal/media_object.h b/include/libcamera/internal/media_object.h
>>> index be6fb8961349..f467883072d2 100644
>>> --- a/include/libcamera/internal/media_object.h
>>> +++ b/include/libcamera/internal/media_object.h
>>> @@ -12,6 +12,8 @@
>>>  
>>>  #include <linux/media.h>
>>>  
>>> +#include <libcamera/class.h>
>>> +
>>>  namespace libcamera {
>>>  
>>>  class MediaDevice;
>>> @@ -50,7 +52,7 @@ private:
>>>  
>>>  	MediaLink(const struct media_v2_link *link,
>>>  		  MediaPad *source, MediaPad *sink);
>>> -	MediaLink(const MediaLink &) = delete;
>>> +	DELETE_COPY_AND_ASSIGN(MediaLink);
>>
>> You have placed DELETE_COPY_AND_ASSIGN() right after private: in patch
>> 2/5. We could try and use the same placement in all classes for
>> consistency. I don't mind much.

I think in those cases, there were no constructors also declared private.

But I don't mind keeping the DELETE_... consistent.


>>
>> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> 
> Actually I think we should disable both copy and move operations,
> there's no need to move these classes. This is known as the rules of
> five: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c21-if-you-define-or-delete-any-copy-move-or-destructor-function-define-or-delete-them-all

I was trying not to change code semantics in this series, though this
patch is a bit of an exception, because it was only deleting the copy
constructor, without the copy assignment operator, and I considered that
a specific bug.

Otherwise, by that rule, we don't need DELETE_COPY_AND_ASSIGN, and we
can always use DELETE_COPY_AND_MOVE in all of the other cases too.

But that's most certainly more of a functional change, so I'd like to do
so on top, as it will require considering each class independently.




>>>  	~MediaLink() {}
>>>  
>>>  	MediaPad *source_;
>>> @@ -72,7 +74,7 @@ private:
>>>  	friend class MediaDevice;
>>>  
>>>  	MediaPad(const struct media_v2_pad *pad, MediaEntity *entity);
>>> -	MediaPad(const MediaPad &) = delete;
>>> +	DELETE_COPY_AND_ASSIGN(MediaPad);
>>>  	~MediaPad();
>>>  
>>>  	unsigned int index_;
>>> @@ -104,7 +106,7 @@ private:
>>>  
>>>  	MediaEntity(MediaDevice *dev, const struct media_v2_entity *entity,
>>>  		    unsigned int major = 0, unsigned int minor = 0);
>>> -	MediaEntity(const MediaEntity &) = delete;
>>> +	DELETE_COPY_AND_ASSIGN(MediaEntity);
>>>  	~MediaEntity();
>>>  
>>>  	void addPad(MediaPad *pad);
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list