7 #ifndef _FCITX_UTILS_DBUS_VARIANT_H_ 8 #define _FCITX_UTILS_DBUS_VARIANT_H_ 13 #include <type_traits> 16 #include <fcitx-utils/fcitxutils_export.h> 18 #include <fcitx-utils/macros.h> 27 class VariantTypeRegistryPrivate;
34 template <
typename TypeName>
37 using PureType = FCITX_STRING_TO_DBUS_TYPE(SignatureType::str());
39 std::is_same<TypeName, PureType>::value,
40 "Type is not pure enough, remove the redundant tuple from it");
45 std::shared_ptr<VariantHelperBase>
46 lookupType(
const std::string &signature)
const;
49 void registerTypeImpl(
const std::string &signature,
50 std::shared_ptr<VariantHelperBase>);
52 std::unique_ptr<VariantTypeRegistryPrivate> d_ptr;
56 std::shared_ptr<VariantHelperBase> FCITXUTILS_EXPORT
57 lookupVariantType(
const std::string &signature);
59 template <
typename TypeName>
60 inline void registerVariantType() {
61 VariantTypeRegistry::defaultRegistry().registerType<TypeName>();
73 typename Dummy = std::enable_if_t<
74 !std::is_same_v<std::remove_cv_t<std::remove_reference_t<Value>>,
78 setData(std::forward<Value>(value));
82 Variant(
const Variant &v) : signature_(v.signature_), helper_(v.helper_) {
84 data_ = helper_->copy(v.data_.get());
89 Variant(Variant &&v) =
default;
90 Variant &operator=(
const Variant &v) {
94 signature_ = v.signature_;
97 data_ = helper_->copy(v.data_.get());
101 Variant &operator=(Variant &&v) =
default;
104 template <
typename Value,
105 typename = std::enable_if_t<!std::is_same<
106 std::remove_cv_t<std::remove_reference_t<Value>>,
108 void setData(Value &&value);
114 void setData(Variant &&v) { *
this = std::move(v); }
119 void setRawData(std::shared_ptr<void> data,
120 std::shared_ptr<VariantHelperBase> helper) {
121 data_ = std::move(data);
122 helper_ = std::move(helper);
124 signature_ = helper_->signature();
130 template <
typename Value>
133 return *
static_cast<Value *
>(data_.get());
139 const std::string &
signature()
const {
return signature_; }
144 helper_->print(builder, data_.get());
149 std::string signature_;
150 std::shared_ptr<void> data_;
151 std::shared_ptr<const VariantHelperBase> helper_;
154 template <
typename Value,
typename>
156 using value_type = std::remove_cv_t<std::remove_reference_t<Value>>;
158 data_ = std::make_shared<value_type>(std::forward<Value>(value));
159 helper_ = std::make_shared<VariantHelper<value_type>>();
164 builder <<
"Variant(sig=" << var.
signature() <<
", content=";
172 #endif // _FCITX_UTILS_DBUS_VARIANT_H_ Basic DBus type of a DBus message.
Variant(const Variant &v)
Copy Construct a variant from another variant.
Variant(Value &&value)
Construct a variant from some existing data.
void setData(Variant &&v)
Set variant data from anthoer variant.
We need to "predefine some of the variant type that we want to handle".
const std::string & signature() const
Return the signature of the data.
void setData(const char *str)
Set variant data with a C-string.
void printData(LogMessageBuilder &builder) const
Print the variant data to log.
void setData(Value &&value)
Set variant data from some existing data.
const Value & dataAs() const
Return data as given type.
Variant type to be used to box or unbox the dbus variant type.
void setData(const Variant &v)
Copy variant data from another variant.