return 'x';
}
+template<>
+constexpr inline char type_of_g_variant_one<std::string>()
+{
+ return 's';
+}
+
+template<>
+constexpr inline char type_of_g_variant_one<std::string_view>()
+{
+ return 's';
+}
+
template <typename T>
constexpr static std::string concat_gvariant_types()
{
template <typename T>
T value_from_g_variant_one_inner(GVariant *variant)
{
+ // This case is disallowed due to lifetime mess potential.
+ // Implament at your own responsibility!
+ static_assert(!std::is_same<T, std::string_view>::value, "You probably meant std::string");
+
+ // Out of completeness:
+ static_assert(!std::is_same<T, std::string>::value, "Implemented elsewhere");
+
char output_type[2] = { type_of_g_variant_one<T>() };
T output_slot;
g_variant_get(variant, output_type, &output_slot);
return output_slot;
}
+template<>
+std::string value_from_g_variant_one_inner<std::string>(GVariant *variant)
+{
+ return std::string(g_variant_get_string(variant, NULL));
+}
+
template <size_t I, typename T>
std::tuple<T> tuple_from_g_variant_inner(GVariant *variant)
{
template <typename T>
GVariant *value_to_g_variant_one_inner(const T &value)
{
+ // Out of completeness:
+ static_assert(!std::is_same<T, std::string>::value, "Implemented elsewhere");
+ static_assert(!std::is_same<T, std::string_view>::value, "Implemented elsewhere");
+
char input_type[2] = { type_of_g_variant_one<T>() };
return g_variant_new(input_type, value);
}
+template <>
+GVariant *value_to_g_variant_one_inner<std::string>(const std::string &value)
+{
+ return g_variant_new_string(value.c_str());
+}
+
+template <>
+GVariant *value_to_g_variant_one_inner<std::string_view>(const std::string_view &value)
+{
+ return g_variant_new_string(value.data());
+}
+
template <size_t I, typename T>
void fill_g_variant_one_table_inner(GVariant **table, const T &value)
{