Message ID | 20190829232653.13214-8-niklas.soderlund@ragnatech.se |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Niklas, Thank you for the patch. On Fri, Aug 30, 2019 at 01:26:46AM +0200, Niklas Söderlund wrote: > Allow the control values in a ControlList to be examined from a const > environment. > > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> > --- > include/libcamera/controls.h | 1 + > src/libcamera/controls.cpp | 34 ++++++++++++++++++++++++++++++++++ > 2 files changed, 35 insertions(+) > > diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h > index fbb3a62274c64259..eee5ef87b8fd2633 100644 > --- a/include/libcamera/controls.h > +++ b/include/libcamera/controls.h > @@ -124,6 +124,7 @@ public: > void clear() { controls_.clear(); } > > ControlValue &operator[](ControlId id); > + const ControlValue &operator[](ControlId id) const; > ControlValue &operator[](const ControlInfo *info) { return controls_[info]; } > > void update(const ControlList &list); > diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp > index 35861e27401d5241..12cbf778408ee8e7 100644 > --- a/src/libcamera/controls.cpp > +++ b/src/libcamera/controls.cpp > @@ -521,6 +521,40 @@ ControlValue &ControlList::operator[](ControlId id) > return controls_[&iter->second]; > } > > +/** > + * \brief Access a control specified by \a id s/a control/the control/ to match the non-const version. > + * \param[in] id The control ID > + * > + * This method returns a reference to the control identified by \a id, if it > + * exists or an empty control if it does not. s/, if it exists/ if it exists,/ I would actually not use "exist" as thats ambiguous (where does it exist, in the control list or in the camera ?). * This method returns a const reference to the control identified by \a id. If * no such controls is present in the list, a const reference to an empty * control value is returned. > + * > + * The behaviour is undefined if the control \a id is not supported by the > + * camera that the ControlList refers to. > + * > + * \return A reference to the value of the control identified by \a id s/A reference/A const reference/ > + */ > +const ControlValue &ControlList::operator[](ControlId id) const > +{ > + const ControlInfoMap &controls = camera_->controls(); > + static ControlValue empty; > + > + const auto iter = controls.find(id); > + if (iter == controls.end()) { > + LOG(Controls, Error) > + << "Camera " << camera_->name() > + << " does not support control " << id; > + return empty; > + } This is common to the non-const version of the function, so I wonder if it should be moved to a separate private method. It could be a bit overkill. > + > + const auto it = controls_.find(&iter->second); iter and it isn't a good idea, please use more explicit names. > + if (it == controls_.end()) { > + LOG(Controls, Error) << "list does not have control " << id; > + return empty; > + } > + > + return it->second; > +} > + > /** > * \fn ControlList::operator[](const ControlInfo *info) > * \brief Access or insert the control specified by \a info
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h index fbb3a62274c64259..eee5ef87b8fd2633 100644 --- a/include/libcamera/controls.h +++ b/include/libcamera/controls.h @@ -124,6 +124,7 @@ public: void clear() { controls_.clear(); } ControlValue &operator[](ControlId id); + const ControlValue &operator[](ControlId id) const; ControlValue &operator[](const ControlInfo *info) { return controls_[info]; } void update(const ControlList &list); diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp index 35861e27401d5241..12cbf778408ee8e7 100644 --- a/src/libcamera/controls.cpp +++ b/src/libcamera/controls.cpp @@ -521,6 +521,40 @@ ControlValue &ControlList::operator[](ControlId id) return controls_[&iter->second]; } +/** + * \brief Access a control specified by \a id + * \param[in] id The control ID + * + * This method returns a reference to the control identified by \a id, if it + * exists or an empty control if it does not. + * + * The behaviour is undefined if the control \a id is not supported by the + * camera that the ControlList refers to. + * + * \return A reference to the value of the control identified by \a id + */ +const ControlValue &ControlList::operator[](ControlId id) const +{ + const ControlInfoMap &controls = camera_->controls(); + static ControlValue empty; + + const auto iter = controls.find(id); + if (iter == controls.end()) { + LOG(Controls, Error) + << "Camera " << camera_->name() + << " does not support control " << id; + return empty; + } + + const auto it = controls_.find(&iter->second); + if (it == controls_.end()) { + LOG(Controls, Error) << "list does not have control " << id; + return empty; + } + + return it->second; +} + /** * \fn ControlList::operator[](const ControlInfo *info) * \brief Access or insert the control specified by \a info
Allow the control values in a ControlList to be examined from a const environment. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> --- include/libcamera/controls.h | 1 + src/libcamera/controls.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+)