[libcamera-devel,RFC,v2,02/14] libcamera: yaml_parser: Extend YamlObject::size() to dictionaries
diff mbox series

Message ID 20220604185939.29163-3-laurent.pinchart@ideasonboard.com
State RFC
Headers show
Series
  • Replace boost JSON parser with libyaml in Raspberry Pi IPA
Related show

Commit Message

Laurent Pinchart June 4, 2022, 6:59 p.m. UTC
Dictionaries have a size too, extend the size() function to support
them.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 include/libcamera/internal/yaml_parser.h |  3 +-
 src/libcamera/yaml_parser.cpp            | 42 +++++++++++++-----------
 test/yaml-parser.cpp                     |  5 +++
 3 files changed, 30 insertions(+), 20 deletions(-)

Comments

Nicolas Dufresne via libcamera-devel June 13, 2022, 4:11 a.m. UTC | #1
Hi Laurent,

On Sat, Jun 04, 2022 at 09:59:27PM +0300, Laurent Pinchart via libcamera-devel wrote:
> Dictionaries have a size too, extend the size() function to support
> them.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>

> ---
>  include/libcamera/internal/yaml_parser.h |  3 +-
>  src/libcamera/yaml_parser.cpp            | 42 +++++++++++++-----------
>  test/yaml-parser.cpp                     |  5 +++
>  3 files changed, 30 insertions(+), 20 deletions(-)
> 
> diff --git a/include/libcamera/internal/yaml_parser.h b/include/libcamera/internal/yaml_parser.h
> index e002fcf59278..b4f852b1ce54 100644
> --- a/include/libcamera/internal/yaml_parser.h
> +++ b/include/libcamera/internal/yaml_parser.h
> @@ -39,6 +39,8 @@ public:
>  		return type_ == Type::Dictionary;
>  	}
>  
> +	std::size_t size() const;
> +
>  #ifndef __DOXYGEN__
>  	template<typename T,
>  		 typename std::enable_if_t<
> @@ -53,7 +55,6 @@ public:
>  #endif
>  	T get(const T &defaultValue, bool *ok = nullptr) const;
>  
> -	std::size_t size() const;
>  	const YamlObject &operator[](std::size_t index) const;
>  
>  	bool contains(const std::string &key) const;
> diff --git a/src/libcamera/yaml_parser.cpp b/src/libcamera/yaml_parser.cpp
> index 4b5ea427bf45..5b872dbb0a2d 100644
> --- a/src/libcamera/yaml_parser.cpp
> +++ b/src/libcamera/yaml_parser.cpp
> @@ -74,6 +74,29 @@ YamlObject::~YamlObject() = default;
>   * \return True if the YamlObject is a dictionary, false otherwise
>   */
>  
> +/**
> + * \fn YamlObject::size()
> + * \brief Retrieve the number of elements in a dictionary or list YamlObject
> + *
> + * This function retrieves the size of the YamlObject, defined as the number of
> + * child elements it contains. Only YamlObject instances of Dictionary or List
> + * types have a size, calling this function on other types of instances is
> + * invalid and results in undefined behaviour.
> + *
> + * \return The size of the YamlObject
> + */
> +std::size_t YamlObject::size() const
> +{
> +	switch (type_) {
> +	case Type::Dictionary:
> +		return dictionary_.size();
> +	case Type::List:
> +		return list_.size();
> +	default:
> +		return 0;
> +	}
> +}
> +
>  /**
>   * \fn template<typename T> YamlObject::get<T>(
>   *	const T &defaultValue, bool *ok) const
> @@ -235,25 +258,6 @@ Size YamlObject::get(const Size &defaultValue, bool *ok) const
>  
>  #endif /* __DOXYGEN__ */
>  
> -/**
> - * \fn YamlObject::size()
> - * \brief Retrieve the number of elements in a list YamlObject
> - *
> - * This function retrieves the size of the YamlObject, defined as the number of
> - * child elements it contains. Only YamlObject instances of List type have a
> - * size, calling this function on other types of instances is invalid and
> - * results in undefined behaviour.
> - *
> - * \return The size of the YamlObject
> - */
> -std::size_t YamlObject::size() const
> -{
> -	if (type_ != Type::List)
> -		return 0;
> -
> -	return list_.size();
> -}
> -
>  /**
>   * \fn YamlObject::operator[](std::size_t index) const
>   * \brief Retrieve the element from list YamlObject by index
> diff --git a/test/yaml-parser.cpp b/test/yaml-parser.cpp
> index 5315d99fae5d..c5b4ddbb19e5 100644
> --- a/test/yaml-parser.cpp
> +++ b/test/yaml-parser.cpp
> @@ -421,6 +421,11 @@ protected:
>  			return TestFail;
>  		}
>  
> +		if (dictObj.size() != 3) {
> +			cerr << "Dictionary object parse with wrong size" << std::endl;
> +			return TestFail;
> +		}
> +
>  		auto memeberNames = dictObj.memberNames();
>  		sort(memeberNames.begin(), memeberNames.end());
>  
> -- 
> Regards,
> 
> Laurent Pinchart
>

Patch
diff mbox series

diff --git a/include/libcamera/internal/yaml_parser.h b/include/libcamera/internal/yaml_parser.h
index e002fcf59278..b4f852b1ce54 100644
--- a/include/libcamera/internal/yaml_parser.h
+++ b/include/libcamera/internal/yaml_parser.h
@@ -39,6 +39,8 @@  public:
 		return type_ == Type::Dictionary;
 	}
 
+	std::size_t size() const;
+
 #ifndef __DOXYGEN__
 	template<typename T,
 		 typename std::enable_if_t<
@@ -53,7 +55,6 @@  public:
 #endif
 	T get(const T &defaultValue, bool *ok = nullptr) const;
 
-	std::size_t size() const;
 	const YamlObject &operator[](std::size_t index) const;
 
 	bool contains(const std::string &key) const;
diff --git a/src/libcamera/yaml_parser.cpp b/src/libcamera/yaml_parser.cpp
index 4b5ea427bf45..5b872dbb0a2d 100644
--- a/src/libcamera/yaml_parser.cpp
+++ b/src/libcamera/yaml_parser.cpp
@@ -74,6 +74,29 @@  YamlObject::~YamlObject() = default;
  * \return True if the YamlObject is a dictionary, false otherwise
  */
 
+/**
+ * \fn YamlObject::size()
+ * \brief Retrieve the number of elements in a dictionary or list YamlObject
+ *
+ * This function retrieves the size of the YamlObject, defined as the number of
+ * child elements it contains. Only YamlObject instances of Dictionary or List
+ * types have a size, calling this function on other types of instances is
+ * invalid and results in undefined behaviour.
+ *
+ * \return The size of the YamlObject
+ */
+std::size_t YamlObject::size() const
+{
+	switch (type_) {
+	case Type::Dictionary:
+		return dictionary_.size();
+	case Type::List:
+		return list_.size();
+	default:
+		return 0;
+	}
+}
+
 /**
  * \fn template<typename T> YamlObject::get<T>(
  *	const T &defaultValue, bool *ok) const
@@ -235,25 +258,6 @@  Size YamlObject::get(const Size &defaultValue, bool *ok) const
 
 #endif /* __DOXYGEN__ */
 
-/**
- * \fn YamlObject::size()
- * \brief Retrieve the number of elements in a list YamlObject
- *
- * This function retrieves the size of the YamlObject, defined as the number of
- * child elements it contains. Only YamlObject instances of List type have a
- * size, calling this function on other types of instances is invalid and
- * results in undefined behaviour.
- *
- * \return The size of the YamlObject
- */
-std::size_t YamlObject::size() const
-{
-	if (type_ != Type::List)
-		return 0;
-
-	return list_.size();
-}
-
 /**
  * \fn YamlObject::operator[](std::size_t index) const
  * \brief Retrieve the element from list YamlObject by index
diff --git a/test/yaml-parser.cpp b/test/yaml-parser.cpp
index 5315d99fae5d..c5b4ddbb19e5 100644
--- a/test/yaml-parser.cpp
+++ b/test/yaml-parser.cpp
@@ -421,6 +421,11 @@  protected:
 			return TestFail;
 		}
 
+		if (dictObj.size() != 3) {
+			cerr << "Dictionary object parse with wrong size" << std::endl;
+			return TestFail;
+		}
+
 		auto memeberNames = dictObj.memberNames();
 		sort(memeberNames.begin(), memeberNames.end());