[libcamera-devel] [PATCH 1/3] libcamera: base: class: Expose Extensible private data to other classes
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Jul 5 12:38:16 CEST 2021
Hi Jacopo,
On Mon, Jul 05, 2021 at 12:29:34PM +0200, Jacopo Mondi wrote:
> On Mon, Jul 05, 2021 at 02:28:15AM +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.
>
> Neat, but how can other internal class access the klass::Private
> implementation which is defined in the .cpp file only ?
Please see 3/3 :-)
> > 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>
> > ---
> > 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