libcamera: utils: Add string join function

Add a utils::join() function to join elements of a container into a
string, with a separator and an optional conversion function if the
elements are not implicitly convertible to std::string.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Laurent Pinchart
2020-03-13 19:59:57 +02:00
parent ebd0cae455
commit 79ce121b6b
3 changed files with 79 additions and 1 deletions
+44
View File
@@ -11,6 +11,7 @@
#include <chrono>
#include <memory>
#include <ostream>
#include <sstream>
#include <string>
#include <string.h>
#include <sys/time.h>
@@ -109,6 +110,49 @@ inline _hex hex<uint64_t>(uint64_t value, unsigned int width)
size_t strlcpy(char *dst, const char *src, size_t size);
#ifndef __DOXYGEN__
template<typename Container, typename UnaryOp>
std::string join(const Container &items, const std::string &sep, UnaryOp op)
{
std::ostringstream ss;
bool first = true;
for (typename Container::const_iterator it = std::begin(items);
it != std::end(items); ++it) {
if (!first)
ss << sep;
else
first = false;
ss << op(*it);
}
return ss.str();
}
template<typename Container>
std::string join(const Container &items, const std::string &sep)
{
std::ostringstream ss;
bool first = true;
for (typename Container::const_iterator it = std::begin(items);
it != std::end(items); ++it) {
if (!first)
ss << sep;
else
first = false;
ss << *it;
}
return ss.str();
}
#else
template<typename Container, typename UnaryOp>
std::string join(const Container &items, const std::string &sep, UnaryOp op = nullptr);
#endif
namespace details {
class StringSplitter
+16
View File
@@ -297,6 +297,22 @@ details::StringSplitter::iterator details::StringSplitter::end() const
return iterator(this, std::string::npos);
}
/**
* \fn template<typename Container, typename UnaryOp> \
* std::string utils::join(const Container &items, const std::string &sep, UnaryOp op)
* \brief Join elements of a container in a string with a separator
* \param[in] items The container
* \param[in] sep The separator to add between elements
* \param[in] op A function that converts individual elements to strings
*
* This function joins all elements in the \a items container into a string and
* returns it. The \a sep separator is added between elements. If the container
* elements are not implicitly convertible to std::string, the \a op function
* shall be provided to perform conversion of elements to std::string.
*
* \return A string that concatenates all elements in the container
*/
/**
* \fn split(const std::string &str, const std::string &delim)
* \brief Split a string based on a delimiter