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>
This commit is contained in:
Laurent Pinchart 2022-08-11 03:50:01 +03:00
parent 22ab0b4193
commit f9c28992a9
2 changed files with 4 additions and 4 deletions

View file

@ -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;