31 #include <QSharedData>
32 #include <QMetaTypeId>
34 namespace qutim_sdk_0_3
37 namespace EnumDetectorHelper
43 inline Yes is_int_type(
int) {
return Yes(); }
44 inline No is_int_type(...) {
return No(); }
46 template <
int Defined,
int Size>
50 static No value() {
return No(); }
54 class Helper<0, sizeof(Yes)>
57 static Yes value() {
return Yes(); }
60 template <
typename T,
int IsEnum>
61 class VariantCastHelper
64 static QVariant convertToVariant(
const T &t)
65 {
return QVariant::fromValue(t); }
66 static T convertFromVariant(
const QVariant &t)
67 {
return t.value<T>(); }
71 class VariantCastHelper <T, sizeof(Yes)>
74 static QVariant convertToVariant(
const T &t)
75 {
return QVariant::fromValue(
int(t)); }
76 static T convertFromVariant(
const QVariant &v)
77 {
return static_cast<T
>(v.toInt()); }
80 template <
typename T,
int Defined>
81 class VariantCastHelper3
84 static QVariant convertToVariant(
const T &t)
86 return VariantCastHelper<T, sizeof(No)>::convertToVariant(t);
88 static T convertFromVariant(
const QVariant &v)
90 return VariantCastHelper<T, sizeof(No)>::convertFromVariant(v);
96 class VariantCastHelper3 <T, 0>
99 static QVariant convertToVariant(
const T &t)
101 return VariantCastHelper<T, sizeof(Helper<QMetaTypeId2<T>::Defined,
sizeof(is_int_type(*reinterpret_cast<T*>(0)))>::value())>::convertToVariant(t);
103 static T convertFromVariant(
const QVariant &v)
105 return VariantCastHelper<T, sizeof(Helper<QMetaTypeId2<T>::Defined,
sizeof(is_int_type(*reinterpret_cast<T*>(0)))>::value())>::convertFromVariant(v);
111 template <
typename T>
112 class VariantCastHelper2
115 static QVariant convertToVariant(
const T &t)
117 return VariantCastHelper3<T, QMetaTypeId2<T>::Defined>::convertToVariant(t);
119 static T convertFromVariant(
const QVariant &v)
121 return VariantCastHelper3<T, QMetaTypeId2<T>::Defined>::convertFromVariant(v);
128 class ConfigBackendPrivate;
135 Q_DECLARE_FLAGS(ValueFlags, ValueFlag)
137 Config(const QVariantList &list);
138 Config(QVariantList *list);
139 Config(const QVariantMap &map);
141 Config(const QString &path = QString());
143 Config(const QStringList &paths);
144 Config(const QString &path, const QVariantList &fallbacks);
145 Config(const QString &path, const QVariant &fallback);
150 Config group(const QString &name) Q_REQUIRED_RESULT;
151 QStringList childGroups() const Q_REQUIRED_RESULT;
152 QStringList childKeys() const Q_REQUIRED_RESULT;
153 bool hasChildGroup(const QString &name) const Q_REQUIRED_RESULT;
154 bool hasChildKey(const QString &name) const Q_REQUIRED_RESULT;
155 void beginGroup(const QString &name);
157 void remove(const QString &name);
159 Config arrayElement(
int index) Q_REQUIRED_RESULT;
160 int beginArray(const QString &name);
162 int arraySize() const Q_REQUIRED_RESULT;
163 void setArrayIndex(
int index);
164 void remove(
int index);
166 QVariant rootValue(const QVariant &def = QVariant(), ValueFlags type = Normal) const Q_REQUIRED_RESULT;
168 T value(const QString &key, const T &def = T(), ValueFlags type = Normal) const Q_REQUIRED_RESULT;
169 QVariant value(const QString &key, const QVariant &def = QVariant(), ValueFlags type = Normal) const Q_REQUIRED_RESULT;
170 inline QString value(const QString &key, const QLatin1String &def, ValueFlags type = Normal) const Q_REQUIRED_RESULT;
171 inline QString value(const QString &key, const
char *def, ValueFlags type = Normal) const Q_REQUIRED_RESULT;
173 QString value(const QString &key, const
char (&def)[N], ValueFlags type = Normal) const Q_REQUIRED_RESULT;
175 void setValue(const QString &key, const T &value, ValueFlags type = Normal);
176 void setValue(const QString &key, const QVariant &value, ValueFlags type = Normal);
177 inline
void setValue(const QString &key, const QLatin1String &value, ValueFlags type = Normal);
178 inline
void setValue(const QString &key, const
char *value, ValueFlags type = Normal);
180 void setValue(const QString &key, const
char (&value)[N], ValueFlags type = Normal);
184 typedef
void (*SaveOperator)(QVariant &, const
void *);
185 typedef
void (*LoadOperator)(const QVariant &,
void *);
186 static
void registerType(
int type, SaveOperator saveOp, LoadOperator loadOp);
188 QExplicitlySharedDataPointer<ConfigPrivate> d_ptr;
191 template <typename T>
194 var = QVariant::fromValue(t);
197 template <
typename T>
203 template <
typename T>
206 typedef void (*SavePtr)(QVariant &,
const T *);
207 typedef void (*LoadPtr)(
const QVariant &, T *);
208 SavePtr sptr = configSaveHelper<T>();
209 LoadPtr lptr = configLoadHelper<T>();
212 reinterpret_cast<Config::SaveOperator>(sptr),
213 reinterpret_cast<Config::LoadOperator>(lptr));
227 virtual QVariant load(
const QString &file) = 0;
228 virtual void save(
const QString &file,
const QVariant &entry) = 0;
230 QByteArray name()
const;
232 virtual void virtual_hook(
int id,
void *data);
234 QScopedPointer<ConfigBackendPrivate> d_ptr;
238 Q_INLINE_TEMPLATE T
Config::value(
const QString &key,
const T &def, Config::ValueFlags type)
const
240 QVariant defVar = EnumDetectorHelper::VariantCastHelper2<T>::convertToVariant(def);
241 return EnumDetectorHelper::VariantCastHelper2<T>::convertFromVariant(value(key, defVar, type));
245 Q_INLINE_TEMPLATE
void Config::setValue(
const QString &key,
const T &value, Config::ValueFlags type)
247 setValue(key, EnumDetectorHelper::VariantCastHelper2<T>::convertToVariant(value), type);
250 QString
Config::value(
const QString &key,
const QLatin1String &def, ValueFlags type)
const
252 return value(key, QString(def), type);
255 QString
Config::value(
const QString &key,
const char *def, ValueFlags type)
const
257 return value(key, QString::fromUtf8(def), type);
261 Q_INLINE_TEMPLATE QString
Config::value(
const QString &key,
const char (&def)[N], ValueFlags type)
const
263 return value(key, QString::fromUtf8(def, N-1), type);
268 setValue(key, QString(value), type);
273 setValue(key, QString::fromUtf8(value), type);
277 Q_INLINE_TEMPLATE
void Config::setValue(
const QString &key,
const char (&value)[N], ValueFlags type)
279 setValue(key, QString::fromUtf8(value, N-1), type);