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