[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