]> Git trees. - libqmvoc.git/commitdiff
adapt sharedkvtmlfiles.h for querymee
authorReto Zingg <g.d0b3rm4n@gmail.com>
Sat, 15 Dec 2012 17:28:49 +0000 (19:28 +0200)
committerReto Zingg <g.d0b3rm4n@gmail.com>
Sat, 21 Sep 2013 12:28:22 +0000 (15:28 +0300)
sharedkvtmlfiles.h

index 7fe1de4b84d2e571aebe09d826d788745acd9d04..e4ab716e524f738e57addf9427bdc82c6e5d3d57 100644 (file)
@@ -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 <jpwhiting@kde.org>
+
+    Copyright 2010, 2012 Reto Zingg <g.d0b3rm4n@gmail.com>
+
  ***************************************************************************/
 
 /***************************************************************************
 #ifndef SHAREDKVTMLFILES_H
 #define SHAREDKVTMLFILES_H
 
-#include "libkeduvocdocument_export.h"
+#include "libqmvocdocument_export.h"
 
 #include <QtCore/QStringList>
 
+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<T> 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<TYPE > _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<TYPE > _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
 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