summaryrefslogtreecommitdiff
path: root/src/libcamera/controls.cpp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-10-25 23:47:22 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-11-20 21:47:26 +0200
commit76b9923e55fd615d0edf065085a4c14475304868 (patch)
tree945a1913ae751f0d69b19b37001cbfd9564227d9 /src/libcamera/controls.cpp
parent4034e45f0ae86932b8e06f578657a121318ef3d2 (diff)
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>
Diffstat (limited to 'src/libcamera/controls.cpp')
-rw-r--r--src/libcamera/controls.cpp19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index 93ad2fc6..c23c1b88 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -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);
}
/**