11#include <boost/algorithm/string.hpp>
12#include <boost/numeric/conversion/cast.hpp>
13#include <boost/tokenizer.hpp>
20void appendKeyValuePair(
const std::pair<std::string, std::string> &kvp,
const bool quoteValues,
21 std::ostringstream &resultStream) {
23 resultStream << kvp.first <<
"='" << kvp.second <<
'\'';
25 resultStream << kvp.first <<
"=" << kvp.second;
34void trimQuotes(QString &
value,
const char quote,
const char escape) {
42 if (
value.startsWith(quote) &&
value.endsWith(quote)) {
63 const auto valueIn =
value;
69 trimQuotes(
value,
'"',
'\\');
70 trimQuotes(
value,
'\'',
'\\');
83 for (
auto &
value : values)
97std::map<std::string, std::string>
parseKeyValueString(
const std::string &str,
const std::string &separator) {
108 boost::tokenizer<boost::escaped_list_separator<char>> tok(
109 str, boost::escaped_list_separator<char>(
"\\", separator,
"\"'"));
110 std::map<std::string, std::string> kvp;
112 for (
const auto &it : tok) {
113 std::vector<std::string> valVec;
114 boost::split(valVec, it, boost::is_any_of(
"="));
116 if (valVec.size() > 1) {
119 std::string key = valVec[0];
121 valVec.begin() = valVec.erase(valVec.begin());
123 std::string
value = boost::algorithm::join(valVec,
"=");
129 if (key.empty() ||
value.empty())
130 throw std::runtime_error(
"Invalid key value pair, '" + it +
"'");
134 throw std::runtime_error(
"Invalid key value pair, '" + it +
"'");
159 auto str = qstr.toStdString();
160 boost::tokenizer<boost::escaped_list_separator<char>> tok(
161 str, boost::escaped_list_separator<char>(
"\\", separator,
"\"'"));
162 std::map<QString, QString> kvp;
164 for (
const auto &it : tok) {
165 auto keyValueString = QString::fromStdString(it);
166 auto valVec = keyValueString.split(
"=");
168 if (valVec.size() > 1) {
171 auto key = valVec[0].trimmed();
173 valVec.removeFirst();
175 auto value = valVec.join(
"=").trimmed();
177 if (key.isEmpty() ||
value.isEmpty())
178 throw std::runtime_error(
"Invalid key value pair, '" + it +
"'");
182 throw std::runtime_error(
"Invalid key value pair, '" + it +
"'");
190QString
convertMapToString(
const std::map<QString, QString> &optionsMap,
const char separator,
const bool quoteValues) {
194 for (
auto &kvp : optionsMap) {
195 if (kvp.second.isEmpty())
203 const auto key = kvp.first;
204 auto value = kvp.second;
209 result += key +
"=" +
value;
217std::string
convertMapToString(
const std::map<std::string, std::string> &optionsMap,
const char separator,
218 const bool quoteValues) {
222 for (
auto &kvp : optionsMap) {
223 if (kvp.second.empty())
231 const auto key = kvp.first;
232 auto value = kvp.second;
237 result += key +
"=" +
value;
243std::string
optionsToString(std::map<std::string, std::string>
const &options,
const bool quoteValues,
244 const std::string &separator) {
245 if (!options.empty()) {
246 std::ostringstream resultStream;
247 auto optionsKvpIt = options.cbegin();
249 auto const &firstKvp = (*optionsKvpIt);
250 appendKeyValuePair(firstKvp, quoteValues, resultStream);
253 for (; optionsKvpIt != options.cend(); ++optionsKvpIt) {
254 auto kvp = (*optionsKvpIt);
255 resultStream << separator;
256 appendKeyValuePair(kvp, quoteValues, resultStream);
259 return resultStream.str();
261 return std::string();
268 return std::string();
270 auto result = std::string(props[0] + std::string(
"=") + options.
getPropertyValue(props[0]));
271 return std::accumulate(++props.cbegin(), props.cend(), result, [&options](
auto const &result,
auto const &prop) {
272 return result + std::string(
";") + prop + std::string(
"=") + options.getPropertyValue(prop);
277 QStringList qStringList;
278 qStringList.reserve(
static_cast<int>(
vec.size()));
279 std::transform(
vec.cbegin(),
vec.cend(), std::back_inserter(qStringList),
280 [](std::string
const &str) { return QString::fromStdString(str); });
285 std::vector<std::string>
vec;
286 vec.reserve(
static_cast<std::size_t
>(qList.size()));
287 std::transform(qList.cbegin(), qList.cend(), std::back_inserter(
vec),
288 [](QString
const &element) { return element.toStdString(); });
293 std::vector<std::string>
vec;
294 vec.reserve(
static_cast<std::size_t
>(qList.size()));
295 std::transform(qList.cbegin(), qList.cend(), std::back_inserter(
vec),
296 [](std::string
const &element) { return element; });
307 QVector<QString> resultVec;
308 resultVec.reserve(boost::numeric_cast<int>(stringVec.size()));
309 std::transform(stringVec.cbegin(), stringVec.cend(), std::back_inserter(resultVec),
310 [](
const auto &str) { return QString::fromStdString(str); });
double value
The value of the point.
std::vector< T > const * vec
virtual std::vector< std::string > getDeclaredPropertyNames() const noexcept=0
Get the list of managed property names.
virtual std::string getPropertyValue(const std::string &name) const =0
Get the value of a property as a string.