[libcamera-devel] [PATCH 17/31] libcamera: controls: Allow passing an std::initializer list to set()
Kieran Bingham
kieran.bingham at ideasonboard.com
Tue Mar 3 01:30:28 CET 2020
On 29/02/2020 16:42, Laurent Pinchart wrote:
> 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 at ideasonboard.com>
Aha, nice - so this is how we then get to 'create' controls like
Control{1,2,3,4} or such ?
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> include/libcamera/controls.h | 10 ++++++++++
> src/libcamera/controls.cpp | 6 ++++++
> 2 files changed, 16 insertions(+)
>
> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
> index d70a6bc4b83a..f99c90e934c1 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 f4089c8ffb4e..829eea6f4240 100644
> --- a/src/libcamera/controls.cpp
> +++ b/src/libcamera/controls.cpp
> @@ -806,6 +806,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
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list