libcamera  v0.5.0+29-e4677362
Supporting cameras in Linux since 2019
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
object.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 /*
3  * Copyright (C) 2019, Google Inc.
4  *
5  * Base object
6  */
7 
8 #pragma once
9 
10 #include <list>
11 #include <memory>
12 #include <utility>
13 #include <vector>
14 
16 #include <libcamera/base/class.h>
17 
18 namespace libcamera {
19 
20 class Message;
21 template<typename... Args>
22 class Signal;
23 class SignalBase;
24 class Thread;
25 
26 class Object
27 {
28 public:
29  Object(Object *parent = nullptr);
30  virtual ~Object();
31 
32  void deleteLater();
33 
34  void postMessage(std::unique_ptr<Message> msg);
35 
36  template<typename T, typename R, typename... FuncArgs, typename... Args,
37  std::enable_if_t<std::is_base_of<Object, T>::value> * = nullptr>
38  R invokeMethod(R (T::*func)(FuncArgs...), ConnectionType type,
39  Args&&... args)
40  {
41  T *obj = static_cast<T *>(this);
42  auto *method = new BoundMethodMember<T, R, FuncArgs...>(obj, this, func, type);
43  return method->activate(std::forward<Args>(args)..., true);
44  }
45 
46  Thread *thread() const { return thread_; }
47  void moveToThread(Thread *thread);
48 
49  Object *parent() const { return parent_; }
50 
51 protected:
52  virtual void message(Message *msg);
53 
54  bool assertThreadBound(const char *message);
55 
56 private:
58 
59  friend class SignalBase;
60  friend class Thread;
61 
62  void notifyThreadMove();
63 
64  void connect(SignalBase *signal);
65  void disconnect(SignalBase *signal);
66 
67  Object *parent_;
68  std::vector<Object *> children_;
69 
70  Thread *thread_;
71  std::list<SignalBase *> signals_;
72  unsigned int pendingMessages_;
73 };
74 
75 } /* namespace libcamera */
Utilities to help constructing class interfaces.
ConnectionType
Connection type for asynchronous communication.
Definition: bound_method.h:19
R invokeMethod(R(T::*func)(FuncArgs...), ConnectionType type, Args &&... args)
Invoke a method asynchronously on an Object instance.
Definition: object.h:38
Top-level libcamera namespace.
Definition: backtrace.h:17
A thread of execution.
Definition: thread.h:30
Object(Object *parent=nullptr)
Construct an Object instance.
Definition: object.cpp:69
virtual ~Object()
Destroy an Object instance.
Definition: object.cpp:98
A message that can be posted to a Thread.
Definition: message.h:23
#define LIBCAMERA_DISABLE_COPY_AND_MOVE(klass)
Disable copy and move construction and assignment of the klass.
Thread * thread() const
Retrieve the thread the object is bound to.
Definition: object.h:46
Object * parent() const
Retrieve the object&#39;s parent.
Definition: object.h:49
Generic signal and slot communication mechanism.
Definition: object.h:22
virtual void message(Message *msg)
Message handler for the object.
Definition: object.cpp:201
Base object to support automatic signal disconnection.
Definition: object.h:26
Method bind and invocation.
void deleteLater()
Schedule deletion of the instance in the thread it belongs to.
Definition: object.cpp:160
void moveToThread(Thread *thread)
Move the object and all its children to a different thread.
Definition: object.cpp:306
void postMessage(std::unique_ptr< Message > msg)
Post a message to the object&#39;s thread.
Definition: object.cpp:184
bool assertThreadBound(const char *message)
Check if the caller complies with thread-bound constraints.
Definition: object.cpp:247