[PATCH v1 3/3] libcamera: controls: Implement `swap()`

Barnabás Pőcze barnabas.pocze at ideasonboard.com
Thu Apr 17 13:35:39 CEST 2025


Implement both free and member function `swap()` for `ControlValue`.
The general `std::swap()` swaps two values by combining a move construction
and two move assignments, but for `ControlValue` a simpler implementation
can be provided by just swapping the members.

Signed-off-by: Barnabás Pőcze <barnabas.pocze at ideasonboard.com>
---
 include/libcamera/controls.h | 24 ++++++++++++++++++++++++
 src/libcamera/controls.cpp   | 15 +++++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 86245e7a9..27b314dbc 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -261,6 +261,30 @@ public:
 	void reserve(ControlType type, bool isArray = false,
 		     std::size_t numElements = 1);
 
+	void swap(ControlValue &other) noexcept
+	{
+		{
+			auto tmp = type_;
+			type_ = other.type_;
+			other.type_ = tmp;
+		}
+
+		std::swap(isArray_, other.isArray_);
+
+		{
+			auto tmp = numElements_;
+			numElements_ = other.numElements_;
+			other.numElements_ = tmp;
+		}
+
+		std::swap(storage_, other.storage_);
+	}
+
+	friend void swap(ControlValue &a, ControlValue &b) noexcept
+	{
+		a.swap(b);
+	}
+
 private:
 	ControlType type_ : 8;
 	bool isArray_;
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index 885287e71..c1ff60f39 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -411,6 +411,21 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen
 		storage_.external = new uint8_t[newSize];
 }
 
+/**
+ * \fn ControlValue::swap(ControlValue &other) noexcept
+ * \brief Swap two control values
+ *
+ * This function swaps the contained value of \a this with that of \a other.
+ */
+
+/**
+ * \fn ControlValue::swap(ControlValue &a, ControlValue &b) noexcept
+ * \brief Swap two control values
+ *
+ * This function swaps the contained value of \a a with that of \a b.
+ * \sa ControlValue::swap()
+ */
+
 /**
  * \class ControlId
  * \brief Control static metadata
-- 
2.49.0



More information about the libcamera-devel mailing list