[libcamera-devel] [PATCH v2] libcamera: controls: Suppress error message from ControlList::get()
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Wed Jul 20 12:18:52 CEST 2022
Hi Naush,
On Wed, Jul 20, 2022 at 09:17:45AM +0100, Naushir Patuck via libcamera-devel wrote:
> On Wed, 20 Jul 2022 at 09:15, Naushir Patuck wrote:
>
> > Now that ControlList::get() returns a std::optional<T> to handle missing
> > controls, the error log message in the call to ControlList::find() is
> > unnecessary and likely invalid.
> >
> > Fix this by avoding the call to ControlList::find() from
> > ControlList::get() and
> > replacing with a call to the underlying std::unordered_map::find().
> >
> > Fixes: 1c4d48018505 ("libcamera: controls: Use std::optional to handle
> > invalid control values")
> > Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> > ---
> > include/libcamera/controls.h | 7 ++++---
> > 1 file changed, 4 insertions(+), 3 deletions(-)
> >
> > diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
> > index 192be78434dc..8362fce813fb 100644
> > --- a/include/libcamera/controls.h
> > +++ b/include/libcamera/controls.h
> > @@ -376,11 +376,12 @@ public:
> > template<typename T>
> > std::optional<T> get(const Control<T> &ctrl) const
> > {
> > - const ControlValue *val = find(ctrl.id());
> > - if (!val)
> > + const auto entry = controls_.find(ctrl.id());
> > + if (entry == controls_.end())
> > return std::nullopt;
> >
> > - return val->get<T>();
> > + const ControlValue &val = entry->second;
> > + return val.get<T>();
>
> Bonus marks if somebody could explain to me why I need to cast
> entry->second to a const for get() to work...? If I don't, the following
> statement:
>
> return entry->second.get<T>()
>
> returns the following compile error:
>
> ../include/libcamera/controls.h: In member function ‘std::optional<_Tp>
> libcamera::ControlList::get(const libcamera::Control<T>&) const’:
> ../include/libcamera/controls.h:384:33: error: expected primary-expression
> before ‘>’ token
> 384 | return ((entry->second)).get<T>();
> | ^
> ../include/libcamera/controls.h:384:35: error: expected primary-expression
> before ‘)’ token
> 384 | return ((entry->second)).get<T>();
>
> ?
You need to write
return entry->second.template get<T>();
Quoting the C++ standard,
When the name of a member template specialization appears after . or ->
in a postfix-expression, or after nested-name-specifier in a
qualified-id, and the postfix-expression or qualified-id explicitly
depends on a template-parameter (14.6.2), the member template name must
be prefixed by the keyword template. Otherwise the name is assumed to
name a non-template.
The "The template disambiguator for dependent names" section in
https://en.cppreference.com/w/cpp/language/dependent_name is easier to
understand for us humans (I didn't say easy though).
> > }
> >
> > template<typename T, typename V>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list