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

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

Commit Message

Laurent Pinchart May 24, 2022, 10:58 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(-)

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 652adf53d0cc..585b545b71c5 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());