/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * Copyright (C) 2020, Google Inc. * * class.h - Utilities and helpers for classes */ #ifndef __LIBCAMERA_BASE_CLASS_H__ #define __LIBCAMERA_BASE_CLASS_H__ #include namespace libcamera { #ifndef __DOXYGEN__ #define LIBCAMERA_DISABLE_COPY(klass) \ klass(const klass &) = delete; \ klass &operator=(const klass &) = delete; #define LIBCAMERA_DISABLE_MOVE(klass) \ klass(klass &&) = delete; \ klass &operator=(klass &&) = delete; #define LIBCAMERA_DISABLE_COPY_AND_MOVE(klass) \ LIBCAMERA_DISABLE_COPY(klass) \ LIBCAMERA_DISABLE_MOVE(klass) #else #define LIBCAMERA_DISABLE_COPY(klass) #define LIBCAMERA_DISABLE_MOVE(klass) #define LIBCAMERA_DISABLE_COPY_AND_MOVE(klass) #endif #ifndef __DOXYGEN__ #define LIBCAMERA_DECLARE_PRIVATE() \ public: \ class Private; \ friend class Private; \ template \ const Private *_d() const \ { \ return Extensible::_d(); \ } \ template \ Private *_d() \ { \ return Extensible::_d(); \ } #define LIBCAMERA_DECLARE_PUBLIC(klass) \ friend class klass; \ using Public = klass; #define LIBCAMERA_D_PTR() \ _d(); #define LIBCAMERA_O_PTR() \ _o(); #else #define LIBCAMERA_DECLARE_PRIVATE() #define LIBCAMERA_DECLARE_PUBLIC(klass) #define LIBCAMERA_D_PTR() #define LIBCAMERA_O_PTR() #endif class Extensible { public: class Private { public: Private(Extensible *o); virtual ~Private(); #ifndef __DOXYGEN__ template const T *_o() const { return static_cast(o_); } template T *_o() { return static_cast(o_); } #endif private: Extensible *const o_; }; Extensible(Private *d); protected: #ifndef __DOXYGEN__ template const T *_d() const { return static_cast(d_.get()); } template T *_d() { return static_cast(d_.get()); } #endif private: const std::unique_ptr d_; }; } /* namespace libcamera */ #endif /* __LIBCAMERA_BASE_CLASS_H__ */