5#ifndef QXMPPDATAFORMBASED_H
6#define QXMPPDATAFORMBASED_H
8#include "QXmppDataForm.h"
26 std::optional<quint32>
parseUInt(
const QVariant &variant)
29 if (
const auto result = variant.toString().toUInt(&ok); ok) {
38 if (
const auto result = variant.toString().toULongLong(&ok); ok) {
44 std::optional<bool>
parseBool(
const QVariant &variant)
46 if (variant.typeId() == QMetaType::Type::Bool) {
47 return variant.toBool();
48 }
else if (variant.typeId() == QMetaType::Type::QString) {
49 auto string = variant.toString();
50 if (
string == u
"1" ||
string == u
"true") {
52 }
else if (
string == u
"0" ||
string == u
"false") {
68 if (!value.isNull()) {
76 if (!value.isEmpty()) {
81 template<
typename T,
typename ValueConverter = T (*)(T)>
85 if (optional.has_value()) {
86 serializeValue(form, type, name.toString(), convert(*optional));
93 if (optional.has_value()) {
94 serializeValue(form, type, name.toString(), QString::number(*optional));
101class QXmppExtensibleDataFormBasePrivate;
106 QXmppExtensibleDataFormBase();
108 QXmppExtensibleDataFormBase(
const QXmppExtensibleDataFormBase &);
109 QXmppExtensibleDataFormBase(QXmppExtensibleDataFormBase &&);
110 virtual ~QXmppExtensibleDataFormBase();
112 QXmppExtensibleDataFormBase &operator=(
const QXmppExtensibleDataFormBase &);
113 QXmppExtensibleDataFormBase &operator=(QXmppExtensibleDataFormBase &&);
126 QSharedDataPointer<QXmppExtensibleDataFormBasePrivate> d;
129namespace QXmpp::Private {
132concept DataFormConvertible =
requires(
const QXmppDataForm &form) {
134 { T::fromDataForm(form) } -> std::same_as<std::optional<T>>;
137template<DataFormConvertible T>
138inline constexpr auto DataFormType = T::DataFormType;