1 /*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 2006 Thomas Braxton <brax108@cox.net>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7
8 #ifndef CONVERSION_CHECK_H
9 #define CONVERSION_CHECK_H
10
11 #include <QDate>
12 #include <QPoint>
13 #include <QRect>
14 #include <QSize>
15 #include <QString>
16 #include <QVariant>
17
18 class QColor;
19 class QFont;
20
21 namespace ConversionCheck
22 {
23 // used to distinguish between supported/unsupported types
24 struct supported {
25 };
26 struct unsupported {
27 };
28
29 // traits type class to define support for constraints
30 template<typename T>
31 struct QVconvertible {
32 typedef unsupported toQString;
33 typedef unsupported toQVariant;
34 };
35
36 // constraint classes
37 template<typename T>
38 struct type_toQString {
constrainttype_toQString39 void constraint()
40 {
41 supported x = y;
42 Q_UNUSED(x);
43 }
44 typename QVconvertible<T>::toQString y;
45 };
46
47 template<typename T>
48 struct type_toQVariant {
constrainttype_toQVariant49 void constraint()
50 {
51 supported x = y;
52 Q_UNUSED(x);
53 }
54 typename QVconvertible<T>::toQVariant y;
55 };
56
57 // check if T is convertible to QString thru QVariant
58 // if not supported can't be used in QList<T> functions
59 template<typename T>
to_QString()60 inline void to_QString()
61 {
62 void (type_toQString<T>::*x)() = &type_toQString<T>::constraint;
63 Q_UNUSED(x);
64 }
65
66 // check if T is convertible to QVariant & supported in readEntry/writeEntry
67 template<typename T>
to_QVariant()68 inline void to_QVariant()
69 {
70 void (type_toQVariant<T>::*x)() = &type_toQVariant<T>::constraint;
71 Q_UNUSED(x);
72 }
73
74 // define for all types handled in readEntry/writeEntry
75 // string_support - is supported by QVariant(type).toString(),
76 // can be used in QList<T> functions
77 // variant_support - has a QVariant constructor
78 #define QVConversions(type, string_support, variant_support) \
79 template<> \
80 struct QVconvertible<type> { \
81 typedef string_support toQString; \
82 typedef variant_support toQVariant; \
83 }
84
85 // The only types needed here are the types handled in readEntry/writeEntry
86 // the default QVconvertible will take care of the rest.
87 QVConversions(bool, supported, supported);
88 QVConversions(int, supported, supported);
89 QVConversions(unsigned int, supported, supported);
90 QVConversions(long long, supported, supported);
91 QVConversions(unsigned long long, supported, supported);
92 QVConversions(float, supported, supported);
93 QVConversions(double, supported, supported);
94 QVConversions(QString, supported, supported);
95 QVConversions(QColor, unsupported, supported);
96 QVConversions(QFont, supported, supported);
97 QVConversions(QDateTime, unsupported, supported);
98 QVConversions(QDate, unsupported, supported);
99 QVConversions(QSize, unsupported, supported);
100 QVConversions(QRect, unsupported, supported);
101 QVConversions(QPoint, unsupported, supported);
102 QVConversions(QSizeF, unsupported, supported);
103 QVConversions(QRectF, unsupported, supported);
104 QVConversions(QPointF, unsupported, supported);
105 QVConversions(QByteArray, supported, supported);
106 QVConversions(QStringList, unsupported, supported);
107 QVConversions(QVariantList, unsupported, supported);
108 QVConversions(QUrl, supported, supported);
109 QVConversions(QList<QUrl>, unsupported, supported);
110 }
111
112 #endif
113