summaryrefslogtreecommitdiff
path: root/src/mbgl/util/token.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/util/token.hpp')
-rw-r--r--src/mbgl/util/token.hpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/mbgl/util/token.hpp b/src/mbgl/util/token.hpp
new file mode 100644
index 0000000000..64192a99f9
--- /dev/null
+++ b/src/mbgl/util/token.hpp
@@ -0,0 +1,50 @@
+#ifndef MBGL_UTIL_TOKEN
+#define MBGL_UTIL_TOKEN
+
+#include <map>
+#include <string>
+#include <algorithm>
+
+namespace mbgl {
+namespace util {
+
+// Replaces {tokens} in a string by calling the lookup function.
+template <typename Lookup>
+std::string replaceTokens(const std::string &source, const Lookup &lookup) {
+ std::string result;
+ result.reserve(source.size());
+
+ auto pos = source.begin();
+ const auto end = source.end();
+
+ while (pos != end) {
+ auto brace = std::find(pos, end, '{');
+ result.append(pos, brace);
+ pos = brace;
+ if (pos != end) {
+ for (brace++; brace != end && (std::isalnum(*brace) || *brace == '_'); brace++);
+ if (brace != end && *brace == '}') {
+ result.append(lookup({ pos + 1, brace }));
+ pos = brace + 1;
+ } else {
+ result.append(pos, brace);
+ pos = brace;
+ }
+ }
+ }
+
+ return result;
+}
+
+template <typename T>
+inline std::string replaceTokens(const std::string &source, const std::map<std::string, T> &properties) {
+ return replaceTokens(source, [&properties](const std::string &token) -> std::string {
+ const auto it_prop = properties.find(token);
+ return it_prop != properties.end() ? toString(it_prop->second) : "";
+ });
+}
+
+} // end namespace util
+} // end namespace mbgl
+
+#endif