libcamera: base: class: Expose Extensible private data to other classes
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. The template argument is defaulted and ignored, as only its presence is required to delay evaluation. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Hirokazu Honda <hiroh@chromium.org> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
37e31b2c6b
commit
a81ccba6a2
1 changed files with 12 additions and 2 deletions
|
@ -33,14 +33,24 @@ namespace libcamera {
|
||||||
#define LIBCAMERA_DECLARE_PRIVATE() \
|
#define LIBCAMERA_DECLARE_PRIVATE() \
|
||||||
public: \
|
public: \
|
||||||
class Private; \
|
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) \
|
#define LIBCAMERA_DECLARE_PUBLIC(klass) \
|
||||||
friend class klass; \
|
friend class klass; \
|
||||||
using Public = klass;
|
using Public = klass;
|
||||||
|
|
||||||
#define LIBCAMERA_D_PTR() \
|
#define LIBCAMERA_D_PTR() \
|
||||||
_d<Private>();
|
_d();
|
||||||
|
|
||||||
#define LIBCAMERA_O_PTR() \
|
#define LIBCAMERA_O_PTR() \
|
||||||
_o<Public>();
|
_o<Public>();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue