[libcamera-devel,v2,09/32] libcamera: controls: Decouple control and value type in ControlList::set()

Message ID 20200306160002.30549-10-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
The ControlList::set() method takes a reference to a Control<T>, and
requires the value to be a reference to T. This prevents the set()
method from being used with value types that are convertible to T, and
in particular with std::array or std::vector value types when the
Control type is a Span<> to support array controls.

Fix this by decoupling the control type and value type in the template
parameters. The compiler will still catch invalid conversions, including
cases where the constructor of type T from the value type is explicit.

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

Patch

diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 9f8a9031bd74..9d93064c11b2 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -223,8 +223,8 @@  public:
 		return val->get<T>();
 	}
 
-	template<typename T>
-	void set(const Control<T> &ctrl, const T &value)
+	template<typename T, typename V>
+	void set(const Control<T> &ctrl, const V &value)
 	{
 		ControlValue *val = find(ctrl.id());
 		if (!val)
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index f632d60adc8b..a136ebd2653b 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -735,7 +735,7 @@  bool ControlList::contains(unsigned int id) const
  */
 
 /**
- * \fn template<typename T> void ControlList::set(const Control<T> &ctrl, const T &value)
+ * \fn template<typename T, typename V> void ControlList::set(const Control<T> &ctrl, const V &value)
  * \brief Set the control \a ctrl value to \a value
  * \param[in] ctrl The control
  * \param[in] value The control value