[libcamera-devel,v2,3/8] cam: options: Create a template class for options

Message ID 20190131234721.22606-4-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • cam: add --format option to configure a stream
Related show

Commit Message

Laurent Pinchart Jan. 31, 2019, 11:47 p.m. UTC
From: Niklas Söderlund <niklas.soderlund@ragnatech.se>

In preparation to adding more parsers create a template class to hold
the parsed information. The rational for making it a template are that
different parsers can index the options using different data types.

The OptionsParser index its options using an int while the upcoming
KeyValyeParser will index its options using strings for example.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
Changes since v1:

- Don't inline the OptionsBase member functions
- Replace class with typename in the OptionsBase template definition
- Pass a const T & to isSet() and operator[]()
---
 src/cam/options.cpp | 50 +++++++++++++++++++++++----------------------
 src/cam/options.h   | 28 ++++++++++++++-----------
 2 files changed, 42 insertions(+), 36 deletions(-)

Patch

diff --git a/src/cam/options.cpp b/src/cam/options.cpp
index 83601270207b..f48bd1fcf1b4 100644
--- a/src/cam/options.cpp
+++ b/src/cam/options.cpp
@@ -12,6 +12,32 @@ 
 
 #include "options.h"
 
+template <typename T>
+bool OptionsBase<T>::valid() const
+{
+	return !values_.empty();
+}
+
+template <typename T>
+bool OptionsBase<T>::isSet(const T &opt) const
+{
+	return values_.find(opt) != values_.end();
+}
+
+template <typename T>
+const std::string &OptionsBase<T>::operator[](const T &opt) const
+{
+	return values_.find(opt)->second;
+}
+
+template <typename T>
+void OptionsBase<T>::clear()
+{
+	values_.clear();
+}
+
+template class OptionsBase<int>;
+
 void OptionsParser::addOption(int opt, const char *help, const char *name,
 			      OptionArgument argument, const char *argumentName)
 {
@@ -166,27 +192,3 @@  void OptionsParser::usage()
 		}
 	}
 }
-
-OptionsParser::Options::Options()
-{
-}
-
-bool OptionsParser::Options::valid() const
-{
-	return !values_.empty();
-}
-
-bool OptionsParser::Options::isSet(int opt) const
-{
-	return values_.find(opt) != values_.end();
-}
-
-const std::string &OptionsParser::Options::operator[](int opt) const
-{
-	return values_.find(opt)->second;
-}
-
-void OptionsParser::Options::clear()
-{
-	values_.clear();
-}
diff --git a/src/cam/options.h b/src/cam/options.h
index 6d1b12d235d8..2bf1f160f3c0 100644
--- a/src/cam/options.h
+++ b/src/cam/options.h
@@ -28,21 +28,25 @@  struct Option {
 	bool hasLongOption() const { return name != nullptr; }
 };
 
+template <typename T>
+class OptionsBase
+{
+public:
+	bool valid() const;
+	bool isSet(const T &opt) const;
+	const std::string &operator[](const T &opt) const;
+
+private:
+	friend class OptionsParser;
+	std::map<T, std::string> values_;
+	void clear();
+};
+
 class OptionsParser
 {
 public:
-	class Options {
-	public:
-		Options();
-
-		bool valid() const;
-		bool isSet(int opt) const;
-		const std::string &operator[](int opt) const;
-
-	private:
-		friend class OptionsParser;
-		std::map<int, std::string> values_;
-		void clear();
+	class Options : public OptionsBase<int>
+	{
 	};
 
 	void addOption(int opt, const char *help, const char *name = nullptr,