From ebf5b5ff9dd802864e078fb59c6533e57a92b002 Mon Sep 17 00:00:00 2001 From: Reto Zingg Date: Sat, 15 Dec 2012 19:28:49 +0200 Subject: [PATCH] adapt sharedkvtmlfiles.h for querymee --- sharedkvtmlfiles.h | 145 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 138 insertions(+), 7 deletions(-) diff --git a/sharedkvtmlfiles.h b/sharedkvtmlfiles.h index 7fe1de4..e4ab716 100644 --- a/sharedkvtmlfiles.h +++ b/sharedkvtmlfiles.h @@ -1,7 +1,14 @@ +/*************************************************************************** +* this file is from kdeedu project. Filename: sharedkvtmlfiles.h +***************************************************************************/ + /*************************************************************************** scan a group of KVTML documents to get information from them ----------------------------------------------------------------------- copyright : (C) 2007 Jeremy Whiting + + Copyright 2010, 2012 Reto Zingg + ***************************************************************************/ /*************************************************************************** @@ -16,10 +23,134 @@ #ifndef SHAREDKVTMLFILES_H #define SHAREDKVTMLFILES_H -#include "libkeduvocdocument_export.h" +#include "libqmvocdocument_export.h" #include +typedef void (*KdeCleanUpFunction)(); + +class KCleanUpGlobalStatic +{ + public: + KdeCleanUpFunction func; + + inline ~KCleanUpGlobalStatic() { func(); } +}; + + +#ifdef Q_CC_MSVC +# define K_GLOBAL_STATIC_STRUCT_NAME(NAME) _k_##NAME##__LINE__ +#else +# define K_GLOBAL_STATIC_STRUCT_NAME(NAME) +#endif + +#define K_GLOBAL_STATIC(TYPE, NAME) K_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ()) + +// from https://projects.kde.org/projects/kde/kdelibs/repository/revisions/02e659a25c68e7ef69af3a951d120bf3371e1fb6/entry/kdecore/kernel/kglobal.h +// In Qt5 QBasicAtomicPointer no longer implicit casts to T* +// Instead it has load() and store() methods which do not exist in Qt4. +// In practice, we should be porting frameworks to the new Q_GLOBAL_STATIC +// which isn't in Qt5 yet, so duplicate for now. +#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) + +#define K_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS) \ +static QBasicAtomicPointer _k_static_##NAME = Q_BASIC_ATOMIC_INITIALIZER(0); \ +static bool _k_static_##NAME##_destroyed; \ +static struct K_GLOBAL_STATIC_STRUCT_NAME(NAME) \ +{ \ + inline bool isDestroyed() const \ + { \ + return _k_static_##NAME##_destroyed; \ + } \ + inline bool exists() const \ + { \ + return _k_static_##NAME != 0; \ + } \ + inline operator TYPE*() \ + { \ + return operator->(); \ + } \ + inline TYPE *operator->() \ + { \ + if (!_k_static_##NAME) { \ + if (isDestroyed()) { \ + qFatal("Fatal Error: Accessed global static '%s *%s()' after destruction. " \ + "Defined at %s:%d", #TYPE, #NAME, __FILE__, __LINE__); \ + } \ + TYPE *x = new TYPE ARGS; \ + if (!_k_static_##NAME.testAndSetOrdered(0, x) \ + && _k_static_##NAME != x ) { \ + delete x; \ + } else { \ + static KCleanUpGlobalStatic cleanUpObject = { destroy }; \ + } \ + } \ + return _k_static_##NAME; \ + } \ + inline TYPE &operator*() \ + { \ + return *operator->(); \ + } \ + static void destroy() \ + { \ + _k_static_##NAME##_destroyed = true; \ + TYPE *x = _k_static_##NAME; \ + _k_static_##NAME = 0; \ + delete x; \ + } \ +} NAME; + +#else + +#define K_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS) \ +static QBasicAtomicPointer _k_static_##NAME = Q_BASIC_ATOMIC_INITIALIZER(0); \ +static bool _k_static_##NAME##_destroyed; \ +static struct K_GLOBAL_STATIC_STRUCT_NAME(NAME) \ +{ \ + inline bool isDestroyed() const \ + { \ + return _k_static_##NAME##_destroyed; \ + } \ + inline bool exists() const \ + { \ + return _k_static_##NAME.load() != 0; \ + } \ + inline operator TYPE*() \ + { \ + return operator->(); \ + } \ + inline TYPE *operator->() \ + { \ + if (!_k_static_##NAME.load()) { \ + if (isDestroyed()) { \ + qFatal("Fatal Error: Accessed global static '%s *%s()' after destruction. " \ + "Defined at %s:%d", #TYPE, #NAME, __FILE__, __LINE__); \ + } \ + TYPE *x = new TYPE ARGS; \ + if (!_k_static_##NAME.testAndSetOrdered(0, x) \ + && _k_static_##NAME.load() != x ) { \ + delete x; \ + } else { \ + static KCleanUpGlobalStatic cleanUpObject = { destroy }; \ + } \ + } \ + return _k_static_##NAME.load(); \ + } \ + inline TYPE &operator*() \ + { \ + return *operator->(); \ + } \ + static void destroy() \ + { \ + _k_static_##NAME##_destroyed = true; \ + TYPE *x = _k_static_##NAME.load(); \ + _k_static_##NAME.store(0); \ + delete x; \ + } \ +} NAME; + +#endif // Qt 5 + /** *namespace and singleton class to scan groups of kvtml files *from shared kvtml location, and give information @@ -29,31 +160,31 @@ namespace SharedKvtmlFiles { /** get list of all languages found in any files */ - KEDUVOCDOCUMENT_EXPORT QStringList languages(); + QMVOCDOCUMENT_EXPORT QStringList languages(); /** get list of filenames found of given language *@param language language requested QString() for all languages *@return a list of filenames with words in language */ - KEDUVOCDOCUMENT_EXPORT QStringList fileNames( const QString &language = QString() ); + QMVOCDOCUMENT_EXPORT QStringList fileNames( const QString &language = QString() ); /** get the list of document titles found of a given language *@param language requested language QString() for all titles *@return a list of document titles with words in language */ - KEDUVOCDOCUMENT_EXPORT QStringList titles( const QString &language = QString() ); + QMVOCDOCUMENT_EXPORT QStringList titles( const QString &language = QString() ); /** get the list of document remarks found of a given language *@param language requested language QString() for all comments *@return a list of document remarks with words in language */ - KEDUVOCDOCUMENT_EXPORT QStringList comments( const QString &language = QString() ); + QMVOCDOCUMENT_EXPORT QStringList comments( const QString &language = QString() ); /** rescan the shared kvtml locations */ - KEDUVOCDOCUMENT_EXPORT void rescan(); + QMVOCDOCUMENT_EXPORT void rescan(); /** sort files downloaded to kvtml top-level dir into locale sub-folders */ - KEDUVOCDOCUMENT_EXPORT void sortDownloadedFiles(); + QMVOCDOCUMENT_EXPORT void sortDownloadedFiles(); } #endif -- 2.47.3