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

Umang Jain umang.jain at ideasonboard.com
Tue Jul 6 07:08:47 CEST 2021


Hi Laurent,

On 7/5/21 4:58 AM, 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.
I like this idea.
> 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.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
  Reviewed-by: Umang Jain <umang.jain 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