[libcamera-devel] [PATCH v2 1/3] libcamera: base: class: Expose Extensible private data to other classes

Kieran Bingham kieran.bingham at ideasonboard.com
Mon Jul 12 10:28:00 CEST 2021


Hi Laurent,

On 11/07/2021 22:06, Laurent Pinchart wrote:
> On Sun, Jul 11, 2021 at 08:03:57PM +0300, Laurent Pinchart wrote:
>> Despite sharing the same name, the private data class created by the
>> Extensible design pattern and the C++ private access specifier have
>> different goals. The latter specifies class members private to the
>> class, while the former stores data not visible to the application.
>>
>> There are use cases for accessing the private data class from other
>> classes inside libcamera. Make this possible by exposing public _d()
>> functions in the class deriving from Extensible. This won't allow access
>> to the private data by applications as the definition of the Private
>> class isn't visible outside of libcamera.
>>
>> The _d() functions need to be defined as template functions to delay
>> their evaluation, as the static_cast() operator in the Extensible::_d()
>> functions needs the Private class to be fully defined.
> 
> This should read
> 
> The _d() functions need to be defined as template functions to delay
> their evaluation, as the static_cast() operator in the Extensible::_d()
> functions needs the Private class to be fully defined. The template
> argument is defaulted an ignored, as only its presence is required to

s/an/and/

> delay evaluation.
> 
>> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
>> Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
>> Reviewed-by: Hirokazu Honda <hiroh at chromium.org>

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

>> ---
>>  include/libcamera/base/class.h | 14 ++++++++++++--
>>  1 file changed, 12 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/libcamera/base/class.h b/include/libcamera/base/class.h
>> index a07dac057331..8212c3d4a5ae 100644
>> --- a/include/libcamera/base/class.h
>> +++ b/include/libcamera/base/class.h
>> @@ -33,14 +33,24 @@ namespace libcamera {
>>  #define LIBCAMERA_DECLARE_PRIVATE()					\
>>  public:									\
>>  	class Private;							\
>> -	friend class Private;
>> +	friend class Private;						\
>> +	template <bool B = true>					\
>> +	const Private *_d() const					\
>> +	{								\
>> +		return Extensible::_d<Private>();			\
>> +	}								\
>> +	template <bool B = true>					\>> +	Private *_d()							\
>> +	{								\
>> +		return Extensible::_d<Private>();			\
>> +	}
>>  
>>  #define LIBCAMERA_DECLARE_PUBLIC(klass)					\
>>  	friend class klass;						\
>>  	using Public = klass;
>>  
>>  #define LIBCAMERA_D_PTR()						\
>> -	_d<Private>();
>> +	_d();
>>  
>>  #define LIBCAMERA_O_PTR()						\
>>  	_o<Public>();
> 


More information about the libcamera-devel mailing list