summaryrefslogtreecommitdiff
path: root/include/libcamera/base/object.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/libcamera/base/object.h')
-rw-r--r--include/libcamera/base/object.h71
1 files changed, 71 insertions, 0 deletions
diff --git a/include/libcamera/base/object.h b/include/libcamera/base/object.h
new file mode 100644
index 00000000..5c385ab4
--- /dev/null
+++ b/include/libcamera/base/object.h
@@ -0,0 +1,71 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * object.h - Base object
+ */
+#ifndef __LIBCAMERA_BASE_OBJECT_H__
+#define __LIBCAMERA_BASE_OBJECT_H__
+
+#include <list>
+#include <memory>
+#include <vector>
+
+#include <libcamera/base/bound_method.h>
+
+namespace libcamera {
+
+class Message;
+template<typename... Args>
+class Signal;
+class SignalBase;
+class Thread;
+
+class Object
+{
+public:
+ Object(Object *parent = nullptr);
+ virtual ~Object();
+
+ void deleteLater();
+
+ void postMessage(std::unique_ptr<Message> msg);
+
+ template<typename T, typename R, typename... FuncArgs, typename... Args,
+ typename std::enable_if_t<std::is_base_of<Object, T>::value> * = nullptr>
+ R invokeMethod(R (T::*func)(FuncArgs...), ConnectionType type,
+ Args... args)
+ {
+ T *obj = static_cast<T *>(this);
+ auto *method = new BoundMethodMember<T, R, FuncArgs...>(obj, this, func, type);
+ return method->activate(args..., true);
+ }
+
+ Thread *thread() const { return thread_; }
+ void moveToThread(Thread *thread);
+
+ Object *parent() const { return parent_; }
+
+protected:
+ virtual void message(Message *msg);
+
+private:
+ friend class SignalBase;
+ friend class Thread;
+
+ void notifyThreadMove();
+
+ void connect(SignalBase *signal);
+ void disconnect(SignalBase *signal);
+
+ Object *parent_;
+ std::vector<Object *> children_;
+
+ Thread *thread_;
+ std::list<SignalBase *> signals_;
+ unsigned int pendingMessages_;
+};
+
+} /* namespace libcamera */
+
+#endif /* __LIBCAMERA_BASE_OBJECT_H__ */