libcamera: controls: Avoid exception in ControlInfoMap count() and find()

The ControlInfoMap count() and find() methods use at() to lookup the
control numerical ID in the idmap_. This causes an exception to be
thrown if the ID doesn't exist in the map. Fix it by using the find()
method instead in find(), and rely on idmap_.count() in count().

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Laurent Pinchart 2019-10-25 23:47:22 +03:00
parent 4034e45f0a
commit 76b9923e55

View file

@ -491,7 +491,12 @@ const ControlInfoMap::mapped_type &ControlInfoMap::at(unsigned int id) const
*/ */
ControlInfoMap::size_type ControlInfoMap::count(unsigned int id) const ControlInfoMap::size_type ControlInfoMap::count(unsigned int id) const
{ {
return count(idmap_.at(id)); /*
* The ControlInfoMap and its idmap have a 1:1 mapping between their
* entries, we can thus just count the matching entries in idmap to
* avoid an additional lookup.
*/
return idmap_.count(id);
} }
/** /**
@ -502,7 +507,11 @@ ControlInfoMap::size_type ControlInfoMap::count(unsigned int id) const
*/ */
ControlInfoMap::iterator ControlInfoMap::find(unsigned int id) ControlInfoMap::iterator ControlInfoMap::find(unsigned int id)
{ {
return find(idmap_.at(id)); auto iter = idmap_.find(id);
if (iter == idmap_.end())
return end();
return find(iter->second);
} }
/** /**
@ -513,7 +522,11 @@ ControlInfoMap::iterator ControlInfoMap::find(unsigned int id)
*/ */
ControlInfoMap::const_iterator ControlInfoMap::find(unsigned int id) const ControlInfoMap::const_iterator ControlInfoMap::find(unsigned int id) const
{ {
return find(idmap_.at(id)); auto iter = idmap_.find(id);
if (iter == idmap_.end())
return end();
return find(iter->second);
} }
/** /**