summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-08-11 03:50:01 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-10-07 18:28:13 +0300
commitf9c28992a9f591124db24b44d94b88ff4ca294f8 (patch)
treea59f8bae7f64b08748b9859294e40350a9b4f2a5
parent22ab0b41936886fe65da9a6a386b69b7ce22620d (diff)
libcamera: controls: Construct Span with size for array controls
The ControlList::set() function overload used for array controls constructs a Span from an initializer list. It doesn't specify the Span size explicitly, which results in a dynamic extent Span being constructed. That causes a compilation failure for fixed-size array controls, as they are defined as Control<T> with T being a fixed-extent Span, and conversion from a dynamic-extent to fixed-extent Span when calling ControlValue::set() can't be implicit. Fix this by constructing the Span using the size of the control, which resolves to a fixed-extent and dynamic-extent Span for fixed-size and dynamic-size array controls respectively. The ControlList::set() function that takes an initializer list can then be used for fixed-size array controls. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
-rw-r--r--include/libcamera/controls.h6
-rw-r--r--src/libcamera/controls.cpp2
2 files changed, 4 insertions, 4 deletions
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 38d0a3e8..cf942055 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -393,14 +393,14 @@ public:
val->set<T>(value);
}
- template<typename T, typename V>
- void set(const Control<T> &ctrl, const std::initializer_list<V> &value)
+ template<typename T, typename V, size_t Size>
+ void set(const Control<Span<T, Size>> &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() });
+ val->set(Span<const typename std::remove_cv_t<V>, Size>{ value.begin(), value.size() });
}
const ControlValue &get(unsigned int id) const;
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index bc3db4f6..6dbf9b34 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -970,7 +970,7 @@ bool ControlList::contains(unsigned int id) const
*/
/**
- * \fn ControlList::set(const Control<T> &ctrl, const std::initializer_list<V> &value)
+ * \fn ControlList::set(const Control<Span<T, Size>> &ctrl, const std::initializer_list<V> &value)
* \copydoc ControlList::set(const Control<T> &ctrl, const V &value)
*/