Skip to content

Commit d261894

Browse files
committed
vcard4: more templates magic
1 parent 7d70c41 commit d261894

File tree

2 files changed

+46
-37
lines changed

2 files changed

+46
-37
lines changed

src/xmpp/xmpp-im/xmpp_vcard4.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -825,9 +825,9 @@ void VCard::fromVCardTemp(const XMPP::VCard &tempVCard)
825825

826826
// Birthday
827827
if (!tempVCard.bday().isNull()) {
828-
setBday({ { PDate { Parameters(), tempVCard.bday() } } });
828+
setBday({ { Parameters(), tempVCard.bday() } });
829829
} else {
830-
setBday({ { PDate { Parameters(), QDate::fromString(tempVCard.bdayStr(), Qt::ISODate) } } });
830+
setBday({ { Parameters(), tempVCard.bdayStr() } });
831831
}
832832

833833
// Addresses

src/xmpp/xmpp-im/xmpp_vcard4.h

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -111,50 +111,36 @@ class UriValue {
111111
QString mediaType;
112112
};
113113

114-
struct ItemBase {
114+
using UriOrText = std::variant<QUrl, QString>;
115+
using TimeZone = std::variant<QUrl, QString, int>;
116+
using Historical = std::variant<QDateTime, QDate, QTime, QString>;
117+
118+
template <typename T> struct ItemBase {
115119
Parameters parameters;
120+
T data;
116121
};
117122

118-
template <typename T> struct Item : public ItemBase {
119-
T data;
120-
operator QString() const { return data; }
121-
operator QDate() const { return {}; }
123+
template <typename T> struct Item : public ItemBase<T> {
124+
operator QString() const { return this->data; } // maybe convertible by Qt means
125+
operator QDate() const { return QDate(this->data); }
126+
operator QUrl() const { return QUrl(this->data); }
122127
};
123128

124-
template <> struct Item<QDate> : public ItemBase {
125-
QDate data;
129+
template <> struct Item<QDate> : public ItemBase<QDate> {
126130
operator QString() const { return data.toString(Qt::ISODate); }
127131
operator QDate() const { return data; }
128132
};
129133

130-
template <> struct Item<QDateTime> : public ItemBase {
131-
QDateTime data;
134+
template <> struct Item<QDateTime> : public ItemBase<QDateTime> {
132135
operator QString() const { return data.toString(Qt::ISODate); }
133136
operator QDate() const { return data.date(); }
134137
};
135138

136-
template <> struct Item<QStringList> : public ItemBase {
137-
QStringList data;
139+
template <> struct Item<QStringList> : public ItemBase<QStringList> {
138140
operator QString() const { return data.value(0); }
139141
};
140142

141-
using UriOrText = std::variant<QUrl, QString>;
142-
using TimeZone = std::variant<QUrl, QString, int>;
143-
using Historical = std::variant<QDateTime, QDate, QTime, QString>;
144-
145-
using PStringList = Item<QStringList>;
146-
using PString = Item<QString>;
147-
using PUri = Item<QUrl>;
148-
using PDate = Item<QDate>;
149-
using PAdvUri = Item<UriValue>;
150-
using PAddress = Item<Address>;
151-
using PNames = Item<Names>;
152-
using PUriOrText = Item<UriOrText>;
153-
using PTimeZone = Item<TimeZone>;
154-
using PHistorical = Item<Historical>;
155-
156-
template <> struct Item<Historical> : public ItemBase {
157-
Historical data;
143+
template <> struct Item<Historical> : public ItemBase<Historical> {
158144
operator QString() const
159145
{
160146
return std::visit(
@@ -186,6 +172,33 @@ template <> struct Item<Historical> : public ItemBase {
186172
}
187173
};
188174

175+
template <> struct Item<UriOrText> : public ItemBase<UriOrText> {
176+
operator QString() const
177+
{
178+
return std::visit(
179+
[this](auto const &v) {
180+
using Tv = std::decay_t<decltype(v)>;
181+
if constexpr (std::is_same_v<Tv, QString>) {
182+
return v;
183+
} else {
184+
return v.toString();
185+
}
186+
},
187+
data);
188+
}
189+
};
190+
191+
using PStringList = Item<QStringList>;
192+
using PString = Item<QString>;
193+
using PUri = Item<QUrl>;
194+
using PDate = Item<QDate>;
195+
using PAdvUri = Item<UriValue>;
196+
using PAddress = Item<Address>;
197+
using PNames = Item<Names>;
198+
using PUriOrText = Item<UriOrText>;
199+
using PTimeZone = Item<TimeZone>;
200+
using PHistorical = Item<Historical>;
201+
189202
template <typename T> class TaggedList : public QList<T> {
190203
public:
191204
using item_type = T;
@@ -199,7 +212,8 @@ template <typename T> class TaggedList : public QList<T> {
199212
*this, [](auto const &a, auto const &b) { return a.parameters.pref > b.parameters.pref; });
200213
}
201214

202-
operator QString() const { return preferred().data; }
215+
operator QString() const { return preferred(); }
216+
operator QUrl() const { return preferred(); }
203217
};
204218

205219
template <> class TaggedList<PAdvUri> : public QList<PAdvUri> {
@@ -221,12 +235,7 @@ template <> class TaggedList<PAdvUri> : public QList<PAdvUri> {
221235
}
222236
};
223237

224-
class TaggedListStringList : public TaggedList<PStringList> {
225-
public:
226-
operator QString() const { return preferred().data.value(0); }
227-
};
228-
229-
using PStringLists = TaggedListStringList;
238+
using PStringLists = TaggedList<PStringList>;
230239
using PStrings = TaggedList<PString>;
231240
using PUris = TaggedList<PUri>;
232241
using PAdvUris = TaggedList<PAdvUri>;

0 commit comments

Comments
 (0)