diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libcamera/meson.build | 1 | ||||
-rw-r--r-- | src/libcamera/object.cpp | 50 | ||||
-rw-r--r-- | src/libcamera/signal.cpp | 5 |
3 files changed, 56 insertions, 0 deletions
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build index c5354c13..8384cd0a 100644 --- a/src/libcamera/meson.build +++ b/src/libcamera/meson.build @@ -10,6 +10,7 @@ libcamera_sources = files([ 'log.cpp', 'media_device.cpp', 'media_object.cpp', + 'object.cpp', 'pipeline_handler.cpp', 'request.cpp', 'signal.cpp', diff --git a/src/libcamera/object.cpp b/src/libcamera/object.cpp new file mode 100644 index 00000000..826eed6f --- /dev/null +++ b/src/libcamera/object.cpp @@ -0,0 +1,50 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * object.cpp - Base object + */ + +#include <libcamera/object.h> +#include <libcamera/signal.h> + +/** + * \file object.h + * \brief Base object to support automatic signal disconnection + */ + +namespace libcamera { + +/** + * \class Object + * \brief Base object to support automatic signal disconnection + * + * The Object class simplifies signal/slot handling for classes implementing + * slots. By inheriting from Object, an object is automatically disconnected + * from all connected signals when it gets destroyed. + * + * \sa Signal + */ + +Object::~Object() +{ + for (SignalBase *signal : signals_) + signal->disconnect(this); +} + +void Object::connect(SignalBase *signal) +{ + signals_.push_back(signal); +} + +void Object::disconnect(SignalBase *signal) +{ + for (auto iter = signals_.begin(); iter != signals_.end(); ) { + if (*iter == signal) + iter = signals_.erase(iter); + else + iter++; + } +} + +}; /* namespace libcamera */ diff --git a/src/libcamera/signal.cpp b/src/libcamera/signal.cpp index 8d62b5be..cb7daa11 100644 --- a/src/libcamera/signal.cpp +++ b/src/libcamera/signal.cpp @@ -47,6 +47,11 @@ namespace libcamera { * \brief Connect the signal to a member function slot * \param object The slot object pointer * \param func The slot member function + * + * If the typename T inherits from Object, the signal will be automatically + * disconnected from the \a func slot of \a object when \a object is destroyed. + * Otherwise the caller shall disconnect signals manually before destroying \a + * object. */ /** |