[PATCH 03/11] ipa: libipa: vector: Specialize YamlObject getter

Kieran Bingham kieran.bingham at ideasonboard.com
Thu Jun 13 10:14:03 CEST 2024


Quoting Laurent Pinchart (2024-06-13 02:39:36)
> Implement a specialization of the YamlObject::Getter structure to
> support deserializing ipa::Vector objects from YAML data.

Diving to the how / why the preceeding patches are used before those
onese themselves :D

> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart 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

Ok - so the design is to keep the gets that mix the two types
(YamlObject, Vector) outside of both of those classes, by implementing a
Getter which yaml_parser.h std::optional<T> get() will be able to map to
through it's "return Getter<T>{}.get(*this);"

Sounds good to me if it's working.

> +       {
> +               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;

Should we be LOGging an error here? This /shouldn't/ happen - I think it
can only happen if someone puts the wrong type into the Yaml object? But
that would be easier to identify/debug with a print... which should be
fairly low cost to add in here right?

Of course there's no error prints on the base type getters either - but
as this is a specialisation - maybe it's more 'custom' and could warrant
more verbosity?

Anyway, either way:


Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> +                       vector[i++] = *value;
> +               }
> +
> +               return vector;
> +       }
> +};
>  #endif /* __DOXYGEN__ */
>  
>  } /* namespace libcamera */
> -- 
> Regards,
> 
> Laurent Pinchart
>


More information about the libcamera-devel mailing list