libcamera  v0.0.0+100-debian/0_git20200629+e7aa92a-8-9-g77f5237c-dirty (2021-05-05T16:20:29+01:00)
Supporting cameras in Linux since 2019
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  * class.h - Utilities and helpers for classes
6  */
7 #ifndef __LIBCAMERA_CLASS_H__
8 #define __LIBCAMERA_CLASS_H__
9 
10 #include <memory>
11 
12 namespace 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() \
34 public: \
35  class Private; \
36  friend class Private;
37 
38 #define LIBCAMERA_DECLARE_PUBLIC(klass) \
39  friend class klass; \
40  using Public = klass;
41 
42 #define LIBCAMERA_D_PTR() \
43  _d<Private>();
44 
45 #define LIBCAMERA_O_PTR() \
46  _o<Public>();
47 
48 #else
49 #define LIBCAMERA_DECLARE_PRIVATE()
50 #define LIBCAMERA_DECLARE_PUBLIC(klass)
51 #define LIBCAMERA_D_PTR()
52 #define LIBCAMERA_O_PTR()
53 #endif
54 
56 {
57 public:
58  class Private
59  {
60  public:
61  Private(Extensible *o);
62  virtual ~Private();
63 
64 #ifndef __DOXYGEN__
65  template<typename T>
66  const T *_o() const
67  {
68  return static_cast<const T *>(o_);
69  }
70 
71  template<typename T>
72  T *_o()
73  {
74  return static_cast<T *>(o_);
75  }
76 #endif
77 
78  private:
79  Extensible *const o_;
80  };
81 
82  Extensible(Private *d);
83 
84 protected:
85 #ifndef __DOXYGEN__
86  template<typename T>
87  const T *_d() const
88  {
89  return static_cast<const T *>(d_.get());
90  }
91 
92  template<typename T>
93  T *_d()
94  {
95  return static_cast<T *>(d_.get());
96  }
97 #endif
98 
99 private:
100  const std::unique_ptr<Private> d_;
101 };
102 
103 } /* namespace libcamera */
104 
105 #endif /* __LIBCAMERA_CLASS_H__ */
Top-level libcamera namespace.
Definition: bound_method.h:15
Base class to manage private data through a d-pointer.
Definition: class.h:55
Extensible(Private *d)
Construct an instance of an Extensible class.
Definition: class.cpp:157