[libcamera-devel] [PATCH 17/23] libcamera: control: Deep-copy control values

Jacopo Mondi jacopo at jmondi.org
Mon Jan 13 17:42:39 CET 2020


Implement operator=() and copy constructor for the ControlValue class,
deep-copying the content of the 'other' ControlValue by using
ControlValue::set() operation which, in case of compound ControlValue,
guarantees proper memory allocation and data copy.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 include/libcamera/controls.h |  5 +++
 src/libcamera/controls.cpp   | 62 ++++++++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+)

diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index bdbdb213528d..d13144b69198 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -43,6 +43,9 @@ public:
 	ControlValue(Span<float> &values);
 	~ControlValue();
 
+	ControlValue(const ControlValue &other);
+	ControlValue &operator=(const ControlValue &other);
+
 	ControlType type() const { return type_; }
 	bool isNone() const { return type_ == ControlTypeNone; }
 	std::size_t numElements() const { return numElements_; }
@@ -81,6 +84,8 @@ private:
 	std::size_t numElements_;
 
 	void release();
+	template<typename T>
+	void copyValue(const ControlValue &source);
 	bool compareElement(const ControlValue &other) const;
 	bool compareElement(const ControlValue &other, unsigned int i) const;
 	std::string elemToString(unsigned int i) const;
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index c311ab1d6af1..fd04d2311db3 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -189,6 +189,68 @@ ControlValue::~ControlValue()
 	release();
 }
 
+template<typename T>
+void ControlValue::copyValue(const ControlValue &other)
+{
+	set<T>(other.get<T>());
+}
+
+/**
+ * \brief Contruct a ControlValue with the content of \a other
+ * \param[in] other The ControlValue to copy content from
+ */
+ControlValue::ControlValue(const ControlValue &other)
+{
+	*this = other;
+}
+
+/**
+ * \brief Replace the content of the ControlValue with the one of \a other
+ * \param[in] other The ControlValue to copy content from
+ *
+ * Deep-copy the content of \a other into the ControlValue by reserving memory
+ * and copy data there in case \a other transports arrays of values in one of
+ * its pointer data members.
+ *
+ * \return The ControlValue with its content replaced with the one of \a other
+ */
+ControlValue &ControlValue::operator=(const ControlValue &other)
+{
+	switch (other.type_) {
+	case ControlTypeBool:
+		copyValue<bool>(other);
+		break;
+	case ControlTypeInteger32:
+		copyValue<int32_t>(other);
+		break;
+	case ControlTypeInteger64:
+		copyValue<int64_t>(other);
+		break;
+	case ControlTypeFloat:
+		copyValue<float>(other);
+		break;
+	case ControlTypeCompoundBool:
+		copyValue<Span<bool>>(other);
+		break;
+	case ControlTypeCompoundInt32:
+		copyValue<Span<int32_t>>(other);
+		break;
+	case ControlTypeCompoundInt64:
+		copyValue<Span<int64_t>>(other);
+		break;
+	case ControlTypeCompoundFloat:
+		copyValue<Span<float>>(other);
+		break;
+	default:
+		break;
+	}
+
+	type_ = other.type_;
+	numElements_ = other.numElements_;
+
+	return *this;
+}
+
 /**
  * \fn ControlValue::type()
  * \brief Retrieve the data type of the value
-- 
2.24.0



More information about the libcamera-devel mailing list