Function for creating std::string keys 29/26329/8
authorJan Olszak <j.olszak@samsung.com>
Tue, 19 Aug 2014 10:54:43 +0000 (12:54 +0200)
committerJan Olszak <j.olszak@samsung.com>
Thu, 21 Aug 2014 14:28:03 +0000 (16:28 +0200)
[Bug/Feature]   Function creating keys from other serializable types
[Cause]         N/A
[Solution]      N/A
[Verification]  Build, install, run tests

Change-Id: I4581b650b85ce2d2bba35daff66dca9d5ec0d936

src/config/kvstore.hpp

index 6b75c91..b01c5da 100644 (file)
@@ -137,12 +137,30 @@ private:
 
 };
 
+namespace {
 template<typename T>
-void KVStore::setInternal(const std::string& key, const T& value)
+std::string toString(const T& value)
 {
     std::ostringstream oss;
     oss << value;
-    setInternal(key, oss.str());
+    return oss.str();
+}
+
+template<typename T>
+T fromString(const std::string& strValue)
+{
+    std::istringstream iss(strValue);
+    T value;
+    iss >> value;
+    return value;
+}
+
+} // namespace
+
+template<typename T>
+void KVStore::setInternal(const std::string& key, const T& value)
+{
+    setInternal(key, toString(value));
 }
 
 template<typename T>
@@ -150,15 +168,10 @@ void KVStore::setInternal(const std::string& key, const std::vector<T>& values)
 {
     std::vector<std::string> strValues(values.size());
 
-    auto toString = [](const T & value) -> std::string {
-        std::ostringstream oss;
-        oss << value;
-        return oss.str();
-    };
     std::transform(values.begin(),
                    values.end(),
                    strValues.begin(),
-                   toString);
+                   toString<T>);
 
     setInternal(key, strValues);
 }
@@ -166,10 +179,7 @@ void KVStore::setInternal(const std::string& key, const std::vector<T>& values)
 template<typename T>
 T KVStore::getInternal(const std::string& key, T*)
 {
-    std::istringstream ss(getInternal(key, static_cast<std::string*>(nullptr)));
-    T ret;
-    ss >> ret;
-    return ret;
+    return fromString<T>(getInternal(key, static_cast<std::string*>(nullptr)));
 }
 
 template<typename T>
@@ -178,19 +188,46 @@ std::vector<T> KVStore::getInternal(const std::string& key, std::vector<T>*)
     std::vector<std::string> strValues = getInternal(key, static_cast<std::vector<std::string>*>(nullptr));
     std::vector<T> values(strValues.size());
 
-    auto parse = [](const std::string & strValue) -> T {
-        std::istringstream iss(strValue);
-        T value;
-        iss >> value;
-        return value;
-    };
     std::transform(strValues.begin(),
                    strValues.end(),
                    values.begin(),
-                   parse);
+                   fromString<T>);
 
     return values;
 }
+
+/**
+ * Concatenates all parameters into one std::string.
+ * Uses '.' to connect the terms.
+ * @param args components of the string
+ * @tparam delim optional delimiter
+ * @tparam typename ... Args any type implementing str
+ * @return string created from he args
+ */
+template<char delim = '.', typename Arg1, typename ... Args>
+std::string key(const Arg1& a1, const Args& ... args)
+{
+    std::string ret = toString(a1);
+    std::initializer_list<std::string> strings {toString(args)...};
+    for (const std::string& s : strings) {
+        ret += delim + s;
+    }
+
+    return ret;
+}
+
+/**
+ * Function added for key function completeness.
+ *
+ * @tparam delim = '.' parameter not used, added for consistency
+ * @return empty string
+ */
+template<char delim = '.'>
+std::string key()
+{
+    return std::string();
+}
+
 } // namespace config
 
 #endif // COMMON_CONFIG_KVSTORE_HPP