[libcamera-devel] [PATCH v2 1/3] libcamera: base: class: Expose Extensible private data to other classes
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sun Jul 11 23:06:19 CEST 2021
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
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>
> ---
> 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>();
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list