[libcamera-devel] [PATCH] libcamera: yaml_parser: Return nullopt on error

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Aug 3 13:16:45 CEST 2022


Hi Jacopo,

Thank you for the patch.

On Wed, Aug 03, 2022 at 01:03:24PM +0200, Jacopo Mondi via libcamera-devel wrote:
> The YamlParser::getList<>() function returns an std::optional<> to allow
> callers to identify cases where parsing the .yaml file failed from cases
> where the parsed list is just empty.
> 
> The current implementation however returns an empty list in case of
> errors, making it impossible for the caller to detect parsing failures.

That's actually not true:

--------
#include <iostream>
#include <optional>
#include <vector>

static std::optional<std::vector<int>> foo(bool null)
{
	if (null)
		return std::nullopt;
	else
		return {};
}

int main()
{
	std::optional<std::vector<int>> opt;

	opt = foo(true);
	std::cout << "- opt " << (opt == std::nullopt ? "==" : "!=") << " std::nullopt" << std::endl;

	opt = foo(false);
	std::cout << "- opt " << (opt == std::nullopt ? "==" : "!=") << " std::nullopt" << std::endl;

	return 0;
}
--------

prints

--------
- opt == std::nullopt
- opt == std::nullopt
--------

{} means a default-constructed object, whose type is inferred from the
return type of the function here, so std::optional<std::vector<int>>()
in this case, which is equal to std::nullopt.

However, I agree that std::nullopt is more explicit, so I like the
change, but the commit message should be reworded.

> Fix this by returning std::nullopt in case of errors.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/libcamera/yaml_parser.cpp | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/src/libcamera/yaml_parser.cpp b/src/libcamera/yaml_parser.cpp
> index 84cb57d6de83..c96e99e1317c 100644
> --- a/src/libcamera/yaml_parser.cpp
> +++ b/src/libcamera/yaml_parser.cpp
> @@ -319,7 +319,7 @@ template<typename T,
>  std::optional<std::vector<T>> YamlObject::getList() const
>  {
>  	if (type_ != Type::List)
> -		return {};
> +		return std::nullopt;
>  
>  	std::vector<T> values;
>  	values.reserve(list_.size());
> @@ -327,7 +327,7 @@ std::optional<std::vector<T>> YamlObject::getList() const
>  	for (const YamlObject &entry : asList()) {
>  		const auto value = entry.get<T>();
>  		if (!value)
> -			return {};
> +			return std::nullopt;
>  		values.emplace_back(*value);
>  	}
>  

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list