[libcamera-devel,v2,17/32] libcamera: controls: Allow passing an std::initializer list to set()

Message ID 20200306160002.30549-18-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • libcamera: Add support for array controls
Related show

Commit Message

Laurent Pinchart March 6, 2020, 3:59 p.m. UTC
For array controls, the ControlList::set() function takes a value as a
type convertible to Span<T>. This allows passing an std::array or an
std::vector in addition to an explicit Span, but doesn't accept an
std::initializer list as Span has no constructor that takes an
initializer list. Callers are thus forced to create temporary objects
explicitly, which isn't nice.

Fix the issue by providing a ControlList::set() function that takes an
std::initializer_list, and convert it to a Span internally.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
 include/libcamera/controls.h | 10 ++++++++++
 src/libcamera/controls.cpp   |  6 ++++++
 2 files changed, 16 insertions(+)

Patch

diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 1e24ae30ab36..2102d5711384 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -335,6 +335,16 @@  public:
 		val->set<T>(value);
 	}
 
+	template<typename T, typename V>
+	void set(const Control<T> &ctrl, const std::initializer_list<V> &value)
+	{
+		ControlValue *val = find(ctrl.id());
+		if (!val)
+			return;
+
+		val->set<T>(Span<const typename std::remove_cv_t<V>>{ value.begin(), value.size() });
+	}
+
 	const ControlValue &get(unsigned int id) const;
 	void set(unsigned int id, const ControlValue &value);
 
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index a1eca992884c..3dd740e5f17e 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -802,6 +802,12 @@  bool ControlList::contains(unsigned int id) const
  * object that the list refers to.
  */
 
+/**
+ * \fn template<typename T, typename V> \
+ * void ControlList::set(const Control<T> &ctrl, const std::initializer_list<V> &value)
+ * \copydoc ControlList::set(const Control<T> &ctrl, const V &value)
+ */
+
 /**
  * \brief Get the value of control \a id
  * \param[in] id The control numerical ID