summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-06-25 04:23:35 +0300
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-07-09 16:15:12 +0200
commitc58bec935c3adffac9d99b1675a563d7f2e9ae04 (patch)
treeacff6a88cdb591f517ab5f1ba3c44e4827401bc0
parentb5f6a2ce2fae423f40c4bdaf1be43ad5070b3868 (diff)
libcamera: utils: Add map_keys() function
Add a map_keys() function to the utils namespace to extract keys from a map. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> [Niklas: change return type to std::vector instead of std::set] Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
-rw-r--r--include/libcamera/internal/utils.h10
-rw-r--r--src/libcamera/utils.cpp7
-rw-r--r--test/utils.cpp22
3 files changed, 39 insertions, 0 deletions
diff --git a/include/libcamera/internal/utils.h b/include/libcamera/internal/utils.h
index 0953423e..8d026cc6 100644
--- a/include/libcamera/internal/utils.h
+++ b/include/libcamera/internal/utils.h
@@ -15,6 +15,7 @@
#include <string>
#include <string.h>
#include <sys/time.h>
+#include <vector>
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
@@ -36,6 +37,15 @@ const char *basename(const char *path);
char *secure_getenv(const char *name);
std::string dirname(const std::string &path);
+template<typename T>
+std::vector<typename T::key_type> map_keys(const T &map)
+{
+ std::vector<typename T::key_type> keys;
+ std::transform(map.begin(), map.end(), std::back_inserter(keys),
+ [](const auto &value) { return value.first; });
+ return keys;
+}
+
template<class InputIt1, class InputIt2>
unsigned int set_overlap(InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2)
diff --git a/src/libcamera/utils.cpp b/src/libcamera/utils.cpp
index d55338fe..0567328f 100644
--- a/src/libcamera/utils.cpp
+++ b/src/libcamera/utils.cpp
@@ -128,6 +128,13 @@ std::string dirname(const std::string &path)
}
/**
+ * \fn std::vector<typename T::key_type> map_keys(const T &map)
+ * \brief Retrieve the keys of a std::map<>
+ * \param[in] map The map whose keys to retrieve
+ * \return A std::vector<> containing the keys of \a map
+ */
+
+/**
* \fn libcamera::utils::set_overlap(InputIt1 first1, InputIt1 last1,
* InputIt2 first2, InputIt2 last2)
* \brief Count the number of elements in the intersection of two ranges
diff --git a/test/utils.cpp b/test/utils.cpp
index 66b91f12..f482e6a1 100644
--- a/test/utils.cpp
+++ b/test/utils.cpp
@@ -6,6 +6,7 @@
*/
#include <iostream>
+#include <map>
#include <sstream>
#include <string>
#include <vector>
@@ -144,6 +145,27 @@ protected:
if (TestPass != testDirname())
return TestFail;
+
+ /* utils::map_keys() test. */
+ const std::map<std::string, unsigned int> map{
+ { "zero", 0 },
+ { "one", 1 },
+ { "two", 2 },
+ };
+ std::vector<std::string> expectedKeys{
+ "zero",
+ "one",
+ "two",
+ };
+
+ std::sort(expectedKeys.begin(), expectedKeys.end());
+
+ const std::vector<std::string> keys = utils::map_keys(map);
+ if (keys != expectedKeys) {
+ cerr << "utils::map_keys() test failed" << endl;
+ return TestFail;
+ }
+
return TestPass;
}
};