[PATCH 03/11] ipa: libipa: vector: Specialize YamlObject getter
Paul Elder
paul.elder at ideasonboard.com
Thu Jun 13 09:30:55 CEST 2024
On Thu, Jun 13, 2024 at 04:39:36AM +0300, Laurent Pinchart wrote:
> Implement a specialization of the YamlObject::Getter structure to
> support deserializing ipa::Vector objects from YAML data.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
> ---
> src/ipa/libipa/vector.cpp | 17 +++++++++++++++++
> src/ipa/libipa/vector.h | 25 +++++++++++++++++++++++++
> 2 files changed, 42 insertions(+)
>
> diff --git a/src/ipa/libipa/vector.cpp b/src/ipa/libipa/vector.cpp
> index 5de4ae48b419..4e987d82fa70 100644
> --- a/src/ipa/libipa/vector.cpp
> +++ b/src/ipa/libipa/vector.cpp
> @@ -148,6 +148,23 @@ namespace ipa {
> * \return True if the two vectors are not equal, false otherwise
> */
>
> +#ifndef __DOXYGEN__
> +bool vectorValidateYaml(const YamlObject &obj, unsigned int size)
> +{
> + if (!obj.isList())
> + return false;
> +
> + if (obj.size() != size) {
> + LOG(Vector, Error)
> + << "Wrong number of values in YAML vector: expected "
> + << size << ", got " << obj.size();
> + return false;
> + }
> +
> + return true;
> +}
> +#endif /* __DOXYGEN__ */
> +
> } /* namespace ipa */
>
> } /* namespace libcamera */
> diff --git a/src/ipa/libipa/vector.h b/src/ipa/libipa/vector.h
> index 7c444363d4bb..4b2fe581ecc2 100644
> --- a/src/ipa/libipa/vector.h
> +++ b/src/ipa/libipa/vector.h
> @@ -180,6 +180,10 @@ bool operator!=(const Vector<T, Rows> &lhs, const Vector<T, Rows> &rhs)
> return !(lhs == rhs);
> }
>
> +#ifndef __DOXYGEN__
> +bool vectorValidateYaml(const YamlObject &obj, unsigned int size);
> +#endif /* __DOXYGEN__ */
> +
> } /* namespace ipa */
>
> #ifndef __DOXYGEN__
> @@ -195,6 +199,27 @@ std::ostream &operator<<(std::ostream &out, const ipa::Vector<T, Rows> &v)
>
> return out;
> }
> +
> +template<typename T, unsigned int Rows>
> +struct YamlObject::Getter<ipa::Vector<T, Rows>> {
> + std::optional<ipa::Vector<T, Rows>> get(const YamlObject &obj) const
> + {
> + if (!ipa::vectorValidateYaml(obj, Rows))
> + return std::nullopt;
> +
> + ipa::Vector<T, Rows> vector;
> +
> + unsigned int i = 0;
> + for (const YamlObject &entry : obj.asList()) {
> + const auto value = entry.get<T>();
> + if (!value)
> + return std::nullopt;
> + vector[i++] = *value;
> + }
> +
> + return vector;
> + }
> +};
> #endif /* __DOXYGEN__ */
>
> } /* namespace libcamera */
More information about the libcamera-devel
mailing list