libcamera: include/libcamera/base/class.h Source File

libcamera v0.7.1 Supporting cameras in Linux since 2019

Loading...
Searching...
No Matches
class.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: LGPL-2.1-or-later */
2/*
3 * Copyright (C) 2020, Google Inc.
4 *
5 * Utilities and helpers for classes
6 */
7
8#pragma once
9
10#include <memory>
11
12namespace libcamera {
13
14#ifndef __DOXYGEN__
15#define LIBCAMERA_DISABLE_COPY(klass) \
16 klass(const klass &) = delete; \
17 klass &operator=(const klass &) = delete;
18
19#define LIBCAMERA_DISABLE_MOVE(klass) \
20 klass(klass &&) = delete; \
21 klass &operator=(klass &&) = delete;
22
23#define LIBCAMERA_DISABLE_COPY_AND_MOVE(klass) \
24 LIBCAMERA_DISABLE_COPY(klass) \
25 LIBCAMERA_DISABLE_MOVE(klass)
26#else
27#define LIBCAMERA_DISABLE_COPY(klass)
28#define LIBCAMERA_DISABLE_MOVE(klass)
29#define LIBCAMERA_DISABLE_COPY_AND_MOVE(klass)
30#endif
31
32#ifndef __DOXYGEN__
33#define LIBCAMERA_DECLARE_PRIVATE() \
34public: \
35 class Private; \
36 friend class Private; \
37 template <bool B = true> \
38 const Private *_d() const \
39 { \
40 return Extensible::_d<Private>(); \
41 } \
42 template <bool B = true> \
43 Private *_d() \
44 { \
45 return Extensible::_d<Private>(); \
46 }
47
48#define LIBCAMERA_DECLARE_PUBLIC(klass) \
49 friend class klass; \
50 using Public = klass;
51
52#define LIBCAMERA_O_PTR() \
53 _o<Public>()
54
55#else
56#define LIBCAMERA_DECLARE_PRIVATE()
57#define LIBCAMERA_DECLARE_PUBLIC(klass)
58#define LIBCAMERA_O_PTR()
59#endif
60
61 class Extensible
62{
63public:
64 class Private
65 {
66 public:
67 Private();
68 virtual ~Private();
69
70#ifndef __DOXYGEN__
71 template<typename T>
72 const T *_o() const
73 {
74 return static_cast<const T *>(o_);
75 }
76
77 template<typename T>
78 T *_o()
79 {
80 return static_cast<T *>(o_);
81 }
82#endif
83
84 private:
85 /* To initialize o_ from Extensible. */
86 friend class Extensible;
87 Extensible *const o_;
88 };
89
90 Extensible(std::unique_ptr<Private> d);
91
92protected:
93 template<typename T>
94 const T *_d() const
95 {
96 return static_cast<const T *>(d_.get());
97 }
98
99 template<typename T>
100 T *_d()
101 {
102 return static_cast<T *>(d_.get());
103 }
104
105private:
106 const std::unique_ptr<Private> d_;
107};
108
109} /* namespace libcamera */
libcamera::Extensible::Private::Private
Private()
Construct an instance of an Extensible class private data.
Definition class.cpp:194
libcamera::Extensible::_d
const T * _d() const
Retrieve the private data instance.
Definition class.h:94
libcamera::Extensible::_d
T * _d()
Retrieve the private data instance.
Definition class.h:100
libcamera::Extensible::Extensible
Extensible(std::unique_ptr< Private > d)
Construct an instance of an Extensible class.
Definition class.cpp:154
libcamera
Top-level libcamera namespace.
Definition backtrace.h:17