7 #ifndef _FCITX_UTILS_DBUS_MESSAGE_DETAILS_H_ 8 #define _FCITX_UTILS_DBUS_MESSAGE_DETAILS_H_ 18 #include <fcitx-utils/tuplehelpers.h> 25 using type = std::tuple<T>;
28 template <
typename... Args>
30 using type = std::tuple<Args...>;
34 using MakeTupleIfNeededType =
typename MakeTupleIfNeeded<T>::type;
41 template <
typename Arg>
47 using RemoveTupleIfUnnecessaryType =
typename RemoveTupleIfUnnecessary<T>::type;
52 template <
typename... Args>
55 template <
typename Key,
typename Value>
64 #define DBUS_SIGNATURE_TRAITS(TYPENAME, SIG) \ 66 struct DBusSignatureTraits<TYPENAME> { \ 67 using signature = MetaString<SIG>; \ 71 struct DBusSignatureToBasicType<SIG> { \ 72 using type = TYPENAME; \ 75 DBUS_SIGNATURE_TRAITS(std::string,
's');
76 DBUS_SIGNATURE_TRAITS(uint8_t,
'y');
77 DBUS_SIGNATURE_TRAITS(
bool,
'b');
78 DBUS_SIGNATURE_TRAITS(int16_t,
'n');
79 DBUS_SIGNATURE_TRAITS(uint16_t,
'q');
80 DBUS_SIGNATURE_TRAITS(int32_t,
'i');
81 DBUS_SIGNATURE_TRAITS(uint32_t,
'u');
82 DBUS_SIGNATURE_TRAITS(int64_t,
'x');
83 DBUS_SIGNATURE_TRAITS(uint64_t,
't');
84 DBUS_SIGNATURE_TRAITS(
double,
'd');
89 template <
typename K,
typename V>
92 ConcatMetaStringType<typename DBusSignatureTraits<K>::signature,
96 template <
typename Arg,
typename... Args>
98 using signature = ConcatMetaStringType<
108 template <
typename... Args>
110 using signature = ConcatMetaStringType<
116 template <
typename Key,
typename Value>
118 using signature = ConcatMetaStringType<
124 template <
typename T>
127 ConcatMetaStringType<MetaString<'a'>,
131 template <
typename T>
134 template <
typename... Args>
140 template <
typename Key,
typename Value>
146 template <
typename T>
151 template <
char left,
char right,
int level,
typename S>
154 template <
char left,
char right,
int level,
char first,
char... next>
158 using str = ConcatMetaStringType<
163 template <
char left,
char right,
int level,
char... next>
165 using type =
typename SkipTillNext<left, right, level + 1,
168 ConcatMetaStringType<MetaString<left>,
173 template <
char left,
char right,
int level,
char... next>
175 using type =
typename SkipTillNext<left, right, level - 1,
178 ConcatMetaStringType<MetaString<right>,
183 template <
char left,
char right,
char first,
char... next>
191 template <
char left,
char right,
char... next>
197 template <
char left,
char right>
210 template <
typename T>
211 using DBusMetaStringSignatureToTuple = MakeTupleIfNeededType<
212 typename decltype(DBusMetaStringSignatureToTupleHelper(
213 std::declval<T>()))::type>;
215 template <
typename... Args>
216 DBusStruct<Args...> TupleToDBusStructHelper(std::tuple<Args...>);
218 template <
typename T>
219 using TupleToDBusStruct = decltype(TupleToDBusStructHelper(std::declval<T>()));
221 template <
typename Key,
typename Value>
224 template <
typename T>
225 using TupleToDictEntry = decltype(TupleToDictEntryHelper(std::declval<T>()));
227 template <
char... next>
230 template <
char first,
char...
nextChar>
239 using cur = std::vector<typename SplitType::cur>;
240 using next =
typename SplitType::next;
243 template <
int level,
typename S>
246 template <
int level,
typename S>
251 using cur = TupleToDBusStruct<DBusMetaStringSignatureToTuple<
252 RemoveMetaStringTailType<
typename SkipTillNextParentheses<
254 using next = DBusMetaStringSignatureToTuple<
255 typename SkipTillNextParentheses<1,
MetaString<nextChar...>>::type>;
258 template <
char... nextChar>
260 using cur = TupleToDictEntry< 261 DBusMetaStringSignatureToTuple<RemoveMetaStringTailType< 262 typename SkipTillNextBrace<1, MetaString<nextChar...>>::str>>>; 263 using next = DBusMetaStringSignatureToTuple< 264 typename SkipTillNextBrace<1, MetaString<nextChar...>>::type>; 268 struct DBusSignatureToType { 269 using SplitType = DBusSignatureGetNextSignature<c...>; 270 using type = RemoveTupleIfUnnecessaryType< 271 CombineTuplesType<MakeTupleIfNeededType<typename SplitType::cur>, 272 MakeTupleIfNeededType<typename SplitType::next>>>; 275 struct DBusSignatureToType<c> { 276 using type = typename DBusSignatureToBasicType<c>::type; 280 struct DBusSignatureToType<> { 281 using type = std::tuple<>; 284 template <typename M> 285 struct MetaStringToDBusTuple; 288 struct MetaStringToDBusTuple<MetaString<c...>> { 289 using type = typename DBusSignatureToType<c...>::type; 292 template <typename M> 293 using MetaStringToDBusTupleType = typename MetaStringToDBusTuple<M>::type; 295 template <typename T> 296 struct DBusTupleToReturn { 301 struct DBusTupleToReturn<std::tuple<>> { 305 template <typename T> 306 using DBusTupleToReturnType = typename DBusTupleToReturn<T>::type; 308 #define FCITX_STRING_TO_DBUS_TUPLE(STRING) \ 309 ::fcitx::dbus::MakeTupleIfNeededType< \ 310 ::fcitx::dbus::MetaStringToDBusTupleType<fcitxMakeMetaString(STRING)>> 311 #define FCITX_STRING_TO_DBUS_TYPE(STRING) \ 312 ::fcitx::dbus::DBusTupleToReturnType< \ 313 ::fcitx::dbus::MetaStringToDBusTupleType<fcitxMakeMetaString(STRING)>> 314 } // namespace fcitx::dbus 316 #endif // _FCITX_UTILS_DBUS_MESSAGE_DETAILS_H_ Class wrap around the unix fd.
Utility class to handle unix file decriptor.
Iter nextChar(Iter iter)
Move iter over next one character.
A type to represent DBus dict entry.
Variant type to be used to box or unbox the dbus variant type.
String like type object path 'o'.
A type to represent DBus struct.