value.accept(visitor);
}
+ template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
+ void readInternal(T& value)
+ {
+ readInternal(*reinterpret_cast<typename std::underlying_type<T>::type*>(&value));
+ }
+
template<typename T>
void readInternal(std::vector<T>& values)
{
visitFields(values, &visitor, &iter);
}
+ template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
+ static void fromGVariant(GVariant* object, T& value)
+ {
+ fromGVariant(object,
+ *reinterpret_cast<typename std::underlying_type<T>::type*>(&value));
+ }
+
template<typename T>
static typename std::enable_if<isUnion<T>::value>::type
fromGVariant(GVariant* object, T& value)
visitFields(values, &visitor, object, idx);
}
- template<typename T, class = typename std::enable_if<isVisitable<T>::value>::type>
+ template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
+ static void fromJsonObject(json_object* object, T& value)
+ {
+ fromJsonObject(object,
+ *reinterpret_cast<typename std::underlying_type<T>::type*>(&value));
+ }
+
+ template<typename T, typename std::enable_if<isVisitable<T>::value, int>::type = 0>
static void fromJsonObject(json_object* object, T& value)
{
checkType(object, json_type_object);
mObject = object ? json_object_get(object) : nullptr;
}
- template<typename T, typename std::enable_if<!isVisitable<T>::value, int>::type = 0>
+ template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
+ void getValue(const std::string& name, T& t)
+ {
+ getValue(name,
+ *reinterpret_cast<typename std::underlying_type<T>::type*>(&t));
+ }
+
+ template<typename T,
+ typename std::enable_if<!isVisitable<T>::value &&
+ !std::is_enum<T>::value, int>::type = 0>
void getValue(const std::string& name, T& t)
{
std::string k = key(mKeyPrefix, name);
void setInternal(const std::string& key, const char* value);
void setInternal(const std::string& key, const std::initializer_list<std::string>& values);
void setInternal(const std::string& key, const std::vector<std::string>& values);
- template<typename T>
+ template<typename T, typename std::enable_if<!std::is_enum<T>::value, int>::type = 0>
+ void setInternal(const std::string& key, const T& value);
+ template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
void setInternal(const std::string& key, const T& value);
template<typename T>
void setInternal(const std::string& key, const std::vector<T>& values);
std::string getInternal(const std::string& key, std::string*);
char* getInternal(const std::string& key, char**);
std::vector<std::string> getInternal(const std::string& key, std::vector<std::string>*);
- template<typename T>
+ template<typename T, typename std::enable_if<!std::is_enum<T>::value, int>::type = 0>
+ T getInternal(const std::string& key, T*);
+ template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
T getInternal(const std::string& key, T*);
template<typename T>
std::vector<T> getInternal(const std::string& key, std::vector<T>*);
} // namespace
-template<typename T>
+template<typename T, typename std::enable_if<!std::is_enum<T>::value, int>::type>
void KVStore::setInternal(const std::string& key, const T& value)
{
setInternal(key, toString(value));
}
+template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type>
+void KVStore::setInternal(const std::string& key, const T& value)
+{
+ setInternal(key,
+ static_cast<const typename std::underlying_type<T>::type>(value));
+}
+
template<typename T>
void KVStore::setInternal(const std::string& key, const std::vector<T>& values)
{
setInternal(key, strValues);
}
-template<typename T>
+template<typename T, typename std::enable_if<!std::is_enum<T>::value, int>::type>
T KVStore::getInternal(const std::string& key, T*)
{
return fromString<T>(getInternal(key, static_cast<std::string*>(nullptr)));
}
+template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type>
+T KVStore::getInternal(const std::string& key, T*)
+{
+ return static_cast<T>(getInternal(key,
+ static_cast<typename std::underlying_type<T>::type*>(nullptr)));
+}
+
template<typename T, std::size_t N>
std::array<T, N> KVStore::getInternal(const std::string& key, std::array<T, N>*)
{
mStore.sendFD(fd.value);
}
+ template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
+ void writeInternal(const T& value)
+ {
+ writeInternal(static_cast<const typename std::underlying_type<T>::type>(value));
+ }
+
template<typename T, typename std::enable_if<std::is_arithmetic<T>::value, int>::type = 0>
void writeInternal(const T& value)
{
g_variant_builder_close(mBuilder);
}
+ template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
+ void writeInternal(const T& value)
+ {
+ writeInternal(static_cast<const typename std::underlying_type<T>::type>(value));
+ }
+
template<typename T>
typename std::enable_if<isVisitable<T>::value && !isUnion<T>::value>::type
writeInternal(const T& value)
return array;
}
- template<typename T, class = typename std::enable_if<isVisitable<T>::value>::type>
+ template<typename T, typename std::enable_if<isVisitable<T>::value, int>::type = 0>
static json_object* toJsonObject(const T& value)
{
ToJsonVisitor visitor;
value.accept(visitor);
return visitor.detach();
}
+
+ template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
+ static json_object* toJsonObject(const T& value)
+ {
+ return toJsonObject(static_cast<const typename std::underlying_type<T>::type>(value));
+ }
+
};
} // namespace config
#include "config/fields.hpp"
#include "config/fields-union.hpp"
+enum class TestEnum: int {
+ FIRST = 0,
+ SECOND = 12
+};
+
struct TestConfig {
// subtree class
struct SubConfig {
char* cstringVal;
double doubleVal;
bool boolVal;
+ TestEnum enumVal;
std::vector<int> emptyIntVector;
std::vector<int> intVector;
cstringVal,
doubleVal,
boolVal,
+ enumVal,
emptyIntVector,
intVector,
"\"cstringVal\": \"blah\", "
"\"doubleVal\": -1.234000, "
"\"boolVal\": true, "
+ "\"enumVal\": 12, "
"\"emptyIntVector\": [ ], "
"\"intVector\": [ 1, 2, 3 ], "
"\"stringVector\": [ \"a\", \"b\" ], "
"\"stringVal\": \"\", "
"\"cstringVal\": \"\", "
"\"boolVal\": false, "
+ "\"enumVal\": 0, "
"\"emptyIntVector\": [ ], "
"\"intVector\": [ ], "
"\"stringVector\": [ ], "
BOOST_CHECK_EQUAL("blah", testConfig.cstringVal);
BOOST_CHECK_CLOSE(-1.234, testConfig.doubleVal, TOLERANCE);
BOOST_CHECK_EQUAL(true, testConfig.boolVal);
+ BOOST_CHECK(TestEnum::SECOND == testConfig.enumVal);
BOOST_REQUIRE_EQUAL(0, testConfig.emptyIntVector.size());