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
{
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)
{
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
{
return find(idmap_.at(id));
auto iter = idmap_.find(id);
if (iter == idmap_.end())
return end();
return find(iter->second);
}
/**