diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2020-06-25 04:23:35 +0300 |
---|---|---|
committer | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2020-07-09 16:15:12 +0200 |
commit | c58bec935c3adffac9d99b1675a563d7f2e9ae04 (patch) | |
tree | acff6a88cdb591f517ab5f1ba3c44e4827401bc0 | |
parent | b5f6a2ce2fae423f40c4bdaf1be43ad5070b3868 (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.h | 10 | ||||
-rw-r--r-- | src/libcamera/utils.cpp | 7 | ||||
-rw-r--r-- | test/utils.cpp | 22 |
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; } }; |