5#ifndef QXMPPXMLTAGS_P_H
6#define QXMPPXMLTAGS_P_H
12namespace QXmpp::Private {
14template<
typename Name, std::convertible_to<QStringView> Xmlns>
19 using NameType = Name;
20 using XmlnsType = Xmlns;
22 Tag(Name name, Xmlns xmlns)
23 : name(std::forward<Name>(name)), xmlns(std::forward<Xmlns>(xmlns)) { }
25 template<
typename N,
typename X>
26 Tag(std::tuple<N, X> &&t) : name(std::get<0>(t)), xmlns(std::get<1>(t)) { }
27 template<
typename N,
typename X>
28 Tag(
const std::tuple<N, X> &t) : name(std::get<0>(t)), xmlns(std::get<1>(t)) { }
31template<
size_t N, std::convertible_to<QStringView> Xmlns>
32Tag(
const char16_t (&str)[N], Xmlns &&) -> Tag<QStringView, Xmlns>;
34template<
typename Name, std::convertible_to<QStringView> Xmlns>
35Tag(Name &&, Xmlns &&) -> Tag<Name, Xmlns>;
37template<
typename Name,
typename Xmlns>
38Tag(std::tuple<Name, Xmlns> &&) -> Tag<Name, Xmlns>;
42 std::is_convertible_v<T, Tag<QStringView, QStringView>> ||
requires() {
44 typename T::XmlnsType;
45 requires std::same_as<std::remove_cvref_t<T>, Tag<typename T::NameType, typename T::XmlnsType>>;
51 requires { { T::XmlTag }; } &&
52 IsXmlTag<
decltype(T::XmlTag)>;
55concept HasPayloadXmlTagDirect =
56 requires { { T::PayloadXmlTag }; } &&
57 IsXmlTag<
decltype(T::PayloadXmlTag)>;
60concept HasPayloadXmlTagIndirect =
61 requires {
typename T::PayloadType; } &&
62 IsXmlTag<
decltype(T::PayloadType::XmlTag)>;
65concept HasPayloadXmlTag = HasPayloadXmlTagDirect<T> || HasPayloadXmlTagIndirect<T>;
67template<HasPayloadXmlTag T>
68constexpr auto PayloadXmlTag = [] {
69 if constexpr (HasPayloadXmlTagIndirect<T>) {
70 return T::PayloadType::XmlTag;
71 }
else if constexpr (HasPayloadXmlTagDirect<T>) {
72 return T::PayloadXmlTag;
77concept HasCustomCheckIqType =
78 requires(
const QString &s1,
const QString &s2) {
79 { T::checkIqType(s1, s2) } -> std::convertible_to<bool>;
82template<
typename T, IsXmlTag Tag>
83bool isPayloadType(Tag xmlTag)
86 Private::HasPayloadXmlTag<T> || HasCustomCheckIqType<T>,
87 "T must offer PayloadXmlTag, PayloadType::XmlTag or checkIqType()");
89 if constexpr (Private::HasPayloadXmlTag<T>) {
90 return xmlTag == Private::PayloadXmlTag<T>;
91 }
else if constexpr (HasCustomCheckIqType<T>) {
92 static_assert(std::convertible_to<std::tuple_element_t<0, Tag>, QString>);
93 static_assert(std::convertible_to<std::tuple_element_t<1, Tag>, QString>);
95 auto &[name, xmlns] = xmlTag;
96 return T::checkIqType(name, xmlns);