mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-02-20 10:54:14 +01:00
LP-513 gcs: remove unused libs/qtconcurrent
This commit is contained in:
parent
54a81fdcf1
commit
2d6d0b6974
@ -4,7 +4,6 @@ CONFIG += ordered
|
||||
SUBDIRS = \
|
||||
version_info \
|
||||
qscispinbox\
|
||||
qtconcurrent \
|
||||
aggregation \
|
||||
extensionsystem \
|
||||
utils \
|
||||
|
@ -1,31 +0,0 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#include "qtconcurrent/multitask.h"
|
||||
#include "qtconcurrent/runextensions.h"
|
@ -1,199 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file multitask.h
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009.
|
||||
* @brief
|
||||
* @see The GNU Public License (GPL) Version 3
|
||||
* @defgroup
|
||||
* @{
|
||||
*
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef MULTITASK_H
|
||||
#define MULTITASK_H
|
||||
|
||||
#include "qtconcurrent_global.h"
|
||||
#include "runextensions.h"
|
||||
|
||||
#include <QtCore/QObject>
|
||||
#include <QtCore/QList>
|
||||
#include <QtCore/QEventLoop>
|
||||
#include <QtCore/QFutureWatcher>
|
||||
#include <QtConcurrent/QtConcurrentRun>
|
||||
#include <QtCore/QThreadPool>
|
||||
|
||||
#include <QtDebug>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtConcurrent {
|
||||
class QTCONCURRENT_EXPORT MultiTaskBase : public QObject, public QRunnable {
|
||||
Q_OBJECT
|
||||
protected slots:
|
||||
virtual void cancelSelf() = 0;
|
||||
virtual void setFinished() = 0;
|
||||
virtual void setProgressRange(int min, int max) = 0;
|
||||
virtual void setProgressValue(int value) = 0;
|
||||
virtual void setProgressText(QString value) = 0;
|
||||
};
|
||||
|
||||
template <typename Class, typename R>
|
||||
class MultiTask : public MultiTaskBase {
|
||||
public:
|
||||
MultiTask(void(Class::*fn)(QFutureInterface<R> &), const QList<Class *> &objects)
|
||||
: fn(fn),
|
||||
objects(objects)
|
||||
{
|
||||
maxProgress = 100 * objects.size();
|
||||
}
|
||||
|
||||
QFuture<R> future()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
return futureInterface.future();
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
QThreadPool::globalInstance()->releaseThread();
|
||||
|
||||
futureInterface.setProgressRange(0, maxProgress);
|
||||
foreach(Class * object, objects) {
|
||||
QFutureWatcher<R> *watcher = new QFutureWatcher<R>();
|
||||
watchers.insert(object, watcher);
|
||||
finished.insert(watcher, false);
|
||||
connect(watcher, SIGNAL(finished()), this, SLOT(setFinished()));
|
||||
connect(watcher, SIGNAL(progressRangeChanged(int, int)), this, SLOT(setProgressRange(int, int)));
|
||||
connect(watcher, SIGNAL(progressValueChanged(int)), this, SLOT(setProgressValue(int)));
|
||||
connect(watcher, SIGNAL(progressTextChanged(QString)), this, SLOT(setProgressText(QString)));
|
||||
watcher->setFuture(QtConcurrent::run(fn, object));
|
||||
}
|
||||
selfWatcher = new QFutureWatcher<R>();
|
||||
connect(selfWatcher, SIGNAL(canceled()), this, SLOT(cancelSelf()));
|
||||
selfWatcher->setFuture(futureInterface.future());
|
||||
loop = new QEventLoop;
|
||||
loop->exec();
|
||||
futureInterface.reportFinished();
|
||||
QThreadPool::globalInstance()->reserveThread();
|
||||
qDeleteAll(watchers.values());
|
||||
delete selfWatcher;
|
||||
delete loop;
|
||||
}
|
||||
protected:
|
||||
void cancelSelf()
|
||||
{
|
||||
foreach(QFutureWatcher<R> *watcher, watchers)
|
||||
watcher->future().cancel();
|
||||
}
|
||||
|
||||
void setFinished()
|
||||
{
|
||||
updateProgress();
|
||||
QFutureWatcher<R> *watcher = static_cast<QFutureWatcher<R> *>(sender());
|
||||
if (finished.contains(watcher)) {
|
||||
finished[watcher] = true;
|
||||
}
|
||||
bool allFinished = true;
|
||||
const QList<bool> finishedValues = finished.values();
|
||||
foreach(bool isFinished, finishedValues) {
|
||||
if (!isFinished) {
|
||||
allFinished = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (allFinished) {
|
||||
loop->quit();
|
||||
}
|
||||
}
|
||||
|
||||
void setProgressRange(int min, int max)
|
||||
{
|
||||
Q_UNUSED(min)
|
||||
Q_UNUSED(max)
|
||||
updateProgress();
|
||||
}
|
||||
|
||||
void setProgressValue(int value)
|
||||
{
|
||||
Q_UNUSED(value)
|
||||
updateProgress();
|
||||
}
|
||||
|
||||
void setProgressText(QString value)
|
||||
{
|
||||
Q_UNUSED(value)
|
||||
updateProgressText();
|
||||
}
|
||||
private:
|
||||
void updateProgress()
|
||||
{
|
||||
int progressSum = 0;
|
||||
const QList<QFutureWatcher<R> *> watchersValues = watchers.values();
|
||||
|
||||
foreach(QFutureWatcher<R> *watcher, watchersValues) {
|
||||
if (watcher->progressMinimum() == watcher->progressMaximum()) {
|
||||
if (watcher->future().isFinished() && !watcher->future().isCanceled()) {
|
||||
progressSum += 100;
|
||||
}
|
||||
} else {
|
||||
progressSum += 100 * (watcher->progressValue() - watcher->progressMinimum()) / (watcher->progressMaximum() - watcher->progressMinimum());
|
||||
}
|
||||
}
|
||||
futureInterface.setProgressValue(progressSum);
|
||||
}
|
||||
|
||||
void updateProgressText()
|
||||
{
|
||||
QString text;
|
||||
const QList<QFutureWatcher<R> *> watchersValues = watchers.values();
|
||||
|
||||
foreach(QFutureWatcher<R> *watcher, watchersValues) {
|
||||
if (!watcher->progressText().isEmpty()) {
|
||||
text += watcher->progressText() + "\n";
|
||||
}
|
||||
}
|
||||
text = text.trimmed();
|
||||
futureInterface.setProgressValueAndText(futureInterface.progressValue(), text);
|
||||
}
|
||||
|
||||
QFutureInterface<R> futureInterface;
|
||||
void (Class::*fn)(QFutureInterface<R> &);
|
||||
QList<Class *> objects;
|
||||
|
||||
QFutureWatcher<R> *selfWatcher;
|
||||
QMap<Class *, QFutureWatcher<R> *> watchers;
|
||||
QMap<QFutureWatcher<R> *, bool> finished;
|
||||
QEventLoop *loop;
|
||||
int maxProgress;
|
||||
};
|
||||
|
||||
template <typename Class, typename T>
|
||||
QFuture<T> run(void (Class::*fn)(QFutureInterface<T> &), const QList<Class *> &objects, int priority = 0)
|
||||
{
|
||||
MultiTask<Class, T> *task = new MultiTask<Class, T>(fn, objects);
|
||||
QFuture<T> future = task->future();
|
||||
QThreadPool::globalInstance()->start(task, priority);
|
||||
return future;
|
||||
}
|
||||
} // namespace QtConcurrent
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // MULTITASK_H
|
@ -1 +0,0 @@
|
||||
LIBS *= -l$$qtLibraryName(QtConcurrent)
|
@ -1,10 +0,0 @@
|
||||
TEMPLATE = lib
|
||||
TARGET = QtConcurrent
|
||||
DEFINES += BUILD_QTCONCURRENT
|
||||
|
||||
include(../../library.pri)
|
||||
|
||||
HEADERS += \
|
||||
qtconcurrent_global.h \
|
||||
multitask.h \
|
||||
runextensions.h
|
@ -1,40 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file qtconcurrent_global.h
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009.
|
||||
* @brief
|
||||
* @see The GNU Public License (GPL) Version 3
|
||||
* @defgroup
|
||||
* @{
|
||||
*
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef QTCONCURRENT_GLOBAL_H
|
||||
#define QTCONCURRENT_GLOBAL_H
|
||||
|
||||
#include <QtCore/qglobal.h>
|
||||
|
||||
#if defined(BUILD_QTCONCURRENT)
|
||||
# define QTCONCURRENT_EXPORT Q_DECL_EXPORT
|
||||
#else
|
||||
# define QTCONCURRENT_EXPORT Q_DECL_IMPORT
|
||||
#endif
|
||||
|
||||
#endif // QTCONCURRENT_GLOBAL_H
|
@ -1,377 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file runextensions.h
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009.
|
||||
* @brief
|
||||
* @see The GNU Public License (GPL) Version 3
|
||||
* @defgroup
|
||||
* @{
|
||||
*
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef QTCONCURRENT_RUNEX_H
|
||||
#define QTCONCURRENT_RUNEX_H
|
||||
|
||||
#include <qrunnable.h>
|
||||
#include <qfutureinterface.h>
|
||||
#include <qthreadpool.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QtConcurrent {
|
||||
template <typename T, typename FunctionPointer>
|
||||
class StoredInterfaceFunctionCall0 : public QRunnable {
|
||||
public:
|
||||
StoredInterfaceFunctionCall0(void(fn)(QFutureInterface<T> &))
|
||||
: fn(fn) {}
|
||||
|
||||
QFuture<T> start()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
QFuture<T> future = futureInterface.future();
|
||||
QThreadPool::globalInstance()->start(this);
|
||||
return future;
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
fn(futureInterface);
|
||||
futureInterface.reportFinished();
|
||||
}
|
||||
private:
|
||||
QFutureInterface<T> futureInterface;
|
||||
FunctionPointer fn;
|
||||
};
|
||||
template <typename T, typename FunctionPointer, typename Class>
|
||||
class StoredInterfaceMemberFunctionCall0 : public QRunnable {
|
||||
public:
|
||||
StoredInterfaceMemberFunctionCall0(void(Class::*fn)(QFutureInterface<T> &), Class *object)
|
||||
: fn(fn), object(object) {}
|
||||
|
||||
QFuture<T> start()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
QFuture<T> future = futureInterface.future();
|
||||
QThreadPool::globalInstance()->start(this);
|
||||
return future;
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
(object->*fn)(futureInterface);
|
||||
futureInterface.reportFinished();
|
||||
}
|
||||
private:
|
||||
QFutureInterface<T> futureInterface;
|
||||
FunctionPointer fn;
|
||||
Class *object;
|
||||
};
|
||||
|
||||
template <typename T, typename FunctionPointer, typename Arg1>
|
||||
class StoredInterfaceFunctionCall1 : public QRunnable {
|
||||
public:
|
||||
StoredInterfaceFunctionCall1(void(fn)(QFutureInterface<T> &, Arg1), Arg1 arg1)
|
||||
: fn(fn), arg1(arg1) {}
|
||||
|
||||
QFuture<T> start()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
QFuture<T> future = futureInterface.future();
|
||||
QThreadPool::globalInstance()->start(this);
|
||||
return future;
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
fn(futureInterface, arg1);
|
||||
futureInterface.reportFinished();
|
||||
}
|
||||
private:
|
||||
QFutureInterface<T> futureInterface;
|
||||
FunctionPointer fn;
|
||||
Arg1 arg1;
|
||||
};
|
||||
template <typename T, typename FunctionPointer, typename Class, typename Arg1>
|
||||
class StoredInterfaceMemberFunctionCall1 : public QRunnable {
|
||||
public:
|
||||
StoredInterfaceMemberFunctionCall1(void(Class::*fn)(QFutureInterface<T> &, Arg1), Class *object, Arg1 arg1)
|
||||
: fn(fn), object(object), arg1(arg1) {}
|
||||
|
||||
QFuture<T> start()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
QFuture<T> future = futureInterface.future();
|
||||
QThreadPool::globalInstance()->start(this);
|
||||
return future;
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
(object->*fn)(futureInterface, arg1);
|
||||
futureInterface.reportFinished();
|
||||
}
|
||||
private:
|
||||
QFutureInterface<T> futureInterface;
|
||||
FunctionPointer fn;
|
||||
Class *object;
|
||||
Arg1 arg1;
|
||||
};
|
||||
|
||||
template <typename T, typename FunctionPointer, typename Arg1, typename Arg2>
|
||||
class StoredInterfaceFunctionCall2 : public QRunnable {
|
||||
public:
|
||||
StoredInterfaceFunctionCall2(void(fn)(QFutureInterface<T> &, Arg1, Arg2), Arg1 arg1, Arg2 arg2)
|
||||
: fn(fn), arg1(arg1), arg2(arg2) {}
|
||||
|
||||
QFuture<T> start()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
QFuture<T> future = futureInterface.future();
|
||||
QThreadPool::globalInstance()->start(this);
|
||||
return future;
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
fn(futureInterface, arg1, arg2);
|
||||
futureInterface.reportFinished();
|
||||
}
|
||||
private:
|
||||
QFutureInterface<T> futureInterface;
|
||||
FunctionPointer fn;
|
||||
Arg1 arg1; Arg2 arg2;
|
||||
};
|
||||
template <typename T, typename FunctionPointer, typename Class, typename Arg1, typename Arg2>
|
||||
class StoredInterfaceMemberFunctionCall2 : public QRunnable {
|
||||
public:
|
||||
StoredInterfaceMemberFunctionCall2(void(Class::*fn)(QFutureInterface<T> &, Arg1, Arg2), Class *object, Arg1 arg1, Arg2 arg2)
|
||||
: fn(fn), object(object), arg1(arg1), arg2(arg2) {}
|
||||
|
||||
QFuture<T> start()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
QFuture<T> future = futureInterface.future();
|
||||
QThreadPool::globalInstance()->start(this);
|
||||
return future;
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
(object->*fn)(futureInterface, arg1, arg2);
|
||||
futureInterface.reportFinished();
|
||||
}
|
||||
private:
|
||||
QFutureInterface<T> futureInterface;
|
||||
FunctionPointer fn;
|
||||
Class *object;
|
||||
Arg1 arg1; Arg2 arg2;
|
||||
};
|
||||
|
||||
template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3>
|
||||
class StoredInterfaceFunctionCall3 : public QRunnable {
|
||||
public:
|
||||
StoredInterfaceFunctionCall3(void(fn)(QFutureInterface<T> &, Arg1, Arg2, Arg3), Arg1 arg1, Arg2 arg2, Arg3 arg3)
|
||||
: fn(fn), arg1(arg1), arg2(arg2), arg3(arg3) {}
|
||||
|
||||
QFuture<T> start()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
QFuture<T> future = futureInterface.future();
|
||||
QThreadPool::globalInstance()->start(this);
|
||||
return future;
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
fn(futureInterface, arg1, arg2, arg3);
|
||||
futureInterface.reportFinished();
|
||||
}
|
||||
private:
|
||||
QFutureInterface<T> futureInterface;
|
||||
FunctionPointer fn;
|
||||
Arg1 arg1; Arg2 arg2; Arg3 arg3;
|
||||
};
|
||||
template <typename T, typename FunctionPointer, typename Class, typename Arg1, typename Arg2, typename Arg3>
|
||||
class StoredInterfaceMemberFunctionCall3 : public QRunnable {
|
||||
public:
|
||||
StoredInterfaceMemberFunctionCall3(void(Class::*fn)(QFutureInterface<T> &, Arg1, Arg2, Arg3), Class *object, Arg1 arg1, Arg2 arg2, Arg3 arg3)
|
||||
: fn(fn), object(object), arg1(arg1), arg2(arg2), arg3(arg3) {}
|
||||
|
||||
QFuture<T> start()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
QFuture<T> future = futureInterface.future();
|
||||
QThreadPool::globalInstance()->start(this);
|
||||
return future;
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
(object->*fn)(futureInterface, arg1, arg2, arg3);
|
||||
futureInterface.reportFinished();
|
||||
}
|
||||
private:
|
||||
QFutureInterface<T> futureInterface;
|
||||
FunctionPointer fn;
|
||||
Class *object;
|
||||
Arg1 arg1; Arg2 arg2; Arg3 arg3;
|
||||
};
|
||||
|
||||
template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
|
||||
class StoredInterfaceFunctionCall4 : public QRunnable {
|
||||
public:
|
||||
StoredInterfaceFunctionCall4(void(fn)(QFutureInterface<T> &, Arg1, Arg2, Arg3, Arg4), Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4)
|
||||
: fn(fn), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {}
|
||||
|
||||
QFuture<T> start()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
QFuture<T> future = futureInterface.future();
|
||||
QThreadPool::globalInstance()->start(this);
|
||||
return future;
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
fn(futureInterface, arg1, arg2, arg3, arg4);
|
||||
futureInterface.reportFinished();
|
||||
}
|
||||
private:
|
||||
QFutureInterface<T> futureInterface;
|
||||
FunctionPointer fn;
|
||||
Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
|
||||
};
|
||||
template <typename T, typename FunctionPointer, typename Class, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
|
||||
class StoredInterfaceMemberFunctionCall4 : public QRunnable {
|
||||
public:
|
||||
StoredInterfaceMemberFunctionCall4(void(Class::*fn)(QFutureInterface<T> &, Arg1, Arg2, Arg3, Arg4), Class *object, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4)
|
||||
: fn(fn), object(object), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {}
|
||||
|
||||
QFuture<T> start()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
QFuture<T> future = futureInterface.future();
|
||||
QThreadPool::globalInstance()->start(this);
|
||||
return future;
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
(object->*fn)(futureInterface, arg1, arg2, arg3, arg4);
|
||||
futureInterface.reportFinished();
|
||||
}
|
||||
private:
|
||||
QFutureInterface<T> futureInterface;
|
||||
FunctionPointer fn;
|
||||
Class *object;
|
||||
Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4;
|
||||
};
|
||||
|
||||
template <typename T, typename FunctionPointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
|
||||
class StoredInterfaceFunctionCall5 : public QRunnable {
|
||||
public:
|
||||
StoredInterfaceFunctionCall5(void(fn)(QFutureInterface<T> &, Arg1, Arg2, Arg3, Arg4, Arg5), Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5)
|
||||
: fn(fn), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4), arg5(arg5) {}
|
||||
|
||||
QFuture<T> start()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
QFuture<T> future = futureInterface.future();
|
||||
QThreadPool::globalInstance()->start(this);
|
||||
return future;
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
fn(futureInterface, arg1, arg2, arg3, arg4, arg5);
|
||||
futureInterface.reportFinished();
|
||||
}
|
||||
private:
|
||||
QFutureInterface<T> futureInterface;
|
||||
FunctionPointer fn;
|
||||
Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
|
||||
};
|
||||
template <typename T, typename FunctionPointer, typename Class, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
|
||||
class StoredInterfaceMemberFunctionCall5 : public QRunnable {
|
||||
public:
|
||||
StoredInterfaceMemberFunctionCall5(void(Class::*fn)(QFutureInterface<T> &, Arg1, Arg2, Arg3, Arg4, Arg5), Class *object, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5)
|
||||
: fn(fn), object(object), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4), arg5(arg5) {}
|
||||
|
||||
QFuture<T> start()
|
||||
{
|
||||
futureInterface.reportStarted();
|
||||
QFuture<T> future = futureInterface.future();
|
||||
QThreadPool::globalInstance()->start(this);
|
||||
return future;
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
(object->*fn)(futureInterface, arg1, arg2, arg3, arg4, arg5);
|
||||
futureInterface.reportFinished();
|
||||
}
|
||||
private:
|
||||
QFutureInterface<T> futureInterface;
|
||||
FunctionPointer fn;
|
||||
Class *object;
|
||||
Arg1 arg1; Arg2 arg2; Arg3 arg3; Arg4 arg4; Arg5 arg5;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
QFuture<T> run(void (*functionPointer)(QFutureInterface<T> &))
|
||||
{
|
||||
return (new StoredInterfaceFunctionCall0<T, void (*)(QFutureInterface<T> &)>(functionPointer))->start();
|
||||
}
|
||||
template <typename T, typename Arg1>
|
||||
QFuture<T> run(void (*functionPointer)(QFutureInterface<T> &, Arg1), Arg1 arg1)
|
||||
{
|
||||
return (new StoredInterfaceFunctionCall1<T, void (*)(QFutureInterface<T> &, Arg1), Arg1>(functionPointer, arg1))->start();
|
||||
}
|
||||
template <typename T, typename Arg1, typename Arg2>
|
||||
QFuture<T> run(void (*functionPointer)(QFutureInterface<T> &, Arg1, Arg2), Arg1 arg1, Arg2 arg2)
|
||||
{
|
||||
return (new StoredInterfaceFunctionCall2<T, void (*)(QFutureInterface<T> &, Arg1, Arg2), Arg1, Arg2>(functionPointer, arg1, arg2))->start();
|
||||
}
|
||||
template <typename T, typename Arg1, typename Arg2, typename Arg3>
|
||||
QFuture<T> run(void (*functionPointer)(QFutureInterface<T> &, Arg1, Arg2, Arg3), Arg1 arg1, Arg2 arg2, Arg3 arg3)
|
||||
{
|
||||
return (new StoredInterfaceFunctionCall3<T, void (*)(QFutureInterface<T> &, Arg1, Arg2, Arg3), Arg1, Arg2, Arg3>(functionPointer, arg1, arg2, arg3))->start();
|
||||
}
|
||||
template <typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
|
||||
QFuture<T> run(void (*functionPointer)(QFutureInterface<T> &, Arg1, Arg2, Arg3, Arg4), Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4)
|
||||
{
|
||||
return (new StoredInterfaceFunctionCall4<T, void (*)(QFutureInterface<T> &, Arg1, Arg2, Arg3, Arg4), Arg1, Arg2, Arg3, Arg4>(functionPointer, arg1, arg2, arg3, arg4))->start();
|
||||
}
|
||||
template <typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
|
||||
QFuture<T> run(void (*functionPointer)(QFutureInterface<T> &, Arg1, Arg2, Arg3, Arg4, Arg5), Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5)
|
||||
{
|
||||
return (new StoredInterfaceFunctionCall5<T, void (*)(QFutureInterface<T> &, Arg1, Arg2, Arg3, Arg4, Arg5), Arg1, Arg2, Arg3, Arg4, Arg5>(functionPointer, arg1, arg2, arg3, arg4, arg5))->start();
|
||||
}
|
||||
|
||||
template <typename Class, typename T>
|
||||
QFuture<T> run(void (Class::*fn)(QFutureInterface<T> &), Class *object)
|
||||
{
|
||||
return (new StoredInterfaceMemberFunctionCall0<T, void(Class::*) (QFutureInterface<T> &), Class>(fn, object))->start();
|
||||
}
|
||||
} // namespace QtConcurrent
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QTCONCURRENT_RUNEX_H
|
@ -1,267 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file filesearch.cpp
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009.
|
||||
* @brief
|
||||
* @see The GNU Public License (GPL) Version 3
|
||||
* @defgroup
|
||||
* @{
|
||||
*
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "filesearch.h"
|
||||
#include <cctype>
|
||||
|
||||
#include <QtCore/QIODevice>
|
||||
#include <QtCore/QBuffer>
|
||||
#include <QtCore/QFile>
|
||||
#include <QtCore/QFutureInterface>
|
||||
#include <QtConcurrent/QtConcurrentRun>
|
||||
#include <QtCore/QRegExp>
|
||||
#include <QtCore/QCoreApplication>
|
||||
|
||||
#include <qtconcurrent/runextensions.h>
|
||||
|
||||
using namespace Utils;
|
||||
|
||||
static inline QString msgCanceled(const QString &searchTerm, int numMatches, int numFilesSearched)
|
||||
{
|
||||
return QCoreApplication::translate("Utils::FileSearch",
|
||||
"%1: canceled. %n occurrences found in %2 files.",
|
||||
NULL, numMatches).
|
||||
arg(searchTerm).arg(numFilesSearched);
|
||||
}
|
||||
|
||||
static inline QString msgFound(const QString &searchTerm, int numMatches, int numFilesSearched)
|
||||
{
|
||||
return QCoreApplication::translate("Utils::FileSearch",
|
||||
"%1: %n occurrences found in %2 files.",
|
||||
NULL, numMatches).
|
||||
arg(searchTerm).arg(numFilesSearched);
|
||||
}
|
||||
|
||||
static inline QString msgFound(const QString &searchTerm, int numMatches, int numFilesSearched, int filesSize)
|
||||
{
|
||||
return QCoreApplication::translate("Utils::FileSearch",
|
||||
"%1: %n occurrences found in %2 of %3 files.",
|
||||
NULL, numMatches).
|
||||
arg(searchTerm).arg(numFilesSearched).arg(filesSize);
|
||||
}
|
||||
|
||||
namespace {
|
||||
void runFileSearch(QFutureInterface<FileSearchResult> &future,
|
||||
QString searchTerm,
|
||||
QStringList files,
|
||||
QTextDocument::FindFlags flags,
|
||||
QMap<QString, QString> fileToContentsMap)
|
||||
{
|
||||
future.setProgressRange(0, files.size());
|
||||
int numFilesSearched = 0;
|
||||
int numMatches = 0;
|
||||
|
||||
bool caseInsensitive = !(flags & QTextDocument::FindCaseSensitively);
|
||||
bool wholeWord = (flags & QTextDocument::FindWholeWords);
|
||||
|
||||
QByteArray sa = searchTerm.toUtf8();
|
||||
int scMaxIndex = sa.length() - 1;
|
||||
const char *sc = sa.constData();
|
||||
|
||||
QByteArray sal = searchTerm.toLower().toUtf8();
|
||||
const char *scl = sal.constData();
|
||||
|
||||
QByteArray sau = searchTerm.toUpper().toUtf8();
|
||||
const char *scu = sau.constData();
|
||||
|
||||
int chunkSize = qMax(100000, sa.length());
|
||||
|
||||
QFile file;
|
||||
QBuffer buffer;
|
||||
foreach(QString s, files) {
|
||||
if (future.isPaused()) {
|
||||
future.waitForResume();
|
||||
}
|
||||
if (future.isCanceled()) {
|
||||
future.setProgressValueAndText(numFilesSearched, msgCanceled(searchTerm, numMatches, numFilesSearched));
|
||||
break;
|
||||
}
|
||||
QIODevice *device;
|
||||
if (fileToContentsMap.contains(s)) {
|
||||
buffer.setData(fileToContentsMap.value(s).toLocal8Bit());
|
||||
device = &buffer;
|
||||
} else {
|
||||
file.setFileName(s);
|
||||
device = &file;
|
||||
}
|
||||
if (!device->open(QIODevice::ReadOnly)) {
|
||||
continue;
|
||||
}
|
||||
int lineNr = 1;
|
||||
const char *startOfLastLine = NULL;
|
||||
|
||||
bool firstChunk = true;
|
||||
while (!device->atEnd()) {
|
||||
if (!firstChunk) {
|
||||
device->seek(device->pos() - sa.length() + 1);
|
||||
}
|
||||
|
||||
const QByteArray chunk = device->read(chunkSize);
|
||||
const char *chunkPtr = chunk.constData();
|
||||
startOfLastLine = chunkPtr;
|
||||
for (const char *regionPtr = chunkPtr; regionPtr < chunkPtr + chunk.length() - scMaxIndex; ++regionPtr) {
|
||||
const char *regionEnd = regionPtr + scMaxIndex;
|
||||
|
||||
if (*regionPtr == '\n') {
|
||||
startOfLastLine = regionPtr + 1;
|
||||
++lineNr;
|
||||
} else if (
|
||||
// case sensitive
|
||||
(!caseInsensitive && *regionPtr == sc[0] && *regionEnd == sc[scMaxIndex])
|
||||
||
|
||||
// case insensitive
|
||||
(caseInsensitive && (*regionPtr == scl[0] || *regionPtr == scu[0])
|
||||
&& (*regionEnd == scl[scMaxIndex] || *regionEnd == scu[scMaxIndex]))
|
||||
) {
|
||||
const char *afterRegion = regionEnd + 1;
|
||||
const char *beforeRegion = regionPtr - 1;
|
||||
bool equal = true;
|
||||
if (wholeWord &&
|
||||
(isalnum(*beforeRegion)
|
||||
|| (*beforeRegion == '_')
|
||||
|| isalnum(*afterRegion)
|
||||
|| (*afterRegion == '_'))) {
|
||||
equal = false;
|
||||
}
|
||||
|
||||
int regionIndex = 1;
|
||||
for (const char *regionCursor = regionPtr + 1; regionCursor < regionEnd; ++regionCursor, ++regionIndex) {
|
||||
if ( // case sensitive
|
||||
(!caseInsensitive && equal && *regionCursor != sc[regionIndex])
|
||||
||
|
||||
// case insensitive
|
||||
(caseInsensitive && equal && *regionCursor != sc[regionIndex] && *regionCursor != scl[regionIndex] && *regionCursor != scu[regionIndex])
|
||||
) {
|
||||
equal = false;
|
||||
}
|
||||
}
|
||||
if (equal) {
|
||||
int textLength = chunk.length() - (startOfLastLine - chunkPtr);
|
||||
if (textLength > 0) {
|
||||
QByteArray res;
|
||||
res.reserve(256);
|
||||
int i = 0;
|
||||
int n = 0;
|
||||
while (startOfLastLine[i] != '\n' && startOfLastLine[i] != '\r' && i < textLength && n++ < 256) {
|
||||
res.append(startOfLastLine[i++]);
|
||||
}
|
||||
future.reportResult(FileSearchResult(s, lineNr, QString(res),
|
||||
regionPtr - startOfLastLine, sa.length()));
|
||||
++numMatches;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
firstChunk = false;
|
||||
}
|
||||
++numFilesSearched;
|
||||
future.setProgressValueAndText(numFilesSearched, msgFound(searchTerm, numMatches, numFilesSearched, files.size()));
|
||||
device->close();
|
||||
}
|
||||
if (!future.isCanceled()) {
|
||||
future.setProgressValueAndText(numFilesSearched, msgFound(searchTerm, numMatches, numFilesSearched));
|
||||
}
|
||||
}
|
||||
|
||||
void runFileSearchRegExp(QFutureInterface<FileSearchResult> &future,
|
||||
QString searchTerm,
|
||||
QStringList files,
|
||||
QTextDocument::FindFlags flags,
|
||||
QMap<QString, QString> fileToContentsMap)
|
||||
{
|
||||
future.setProgressRange(0, files.size());
|
||||
int numFilesSearched = 0;
|
||||
int numMatches = 0;
|
||||
if (flags & QTextDocument::FindWholeWords) {
|
||||
searchTerm = QString::fromLatin1("\\b%1\\b").arg(searchTerm);
|
||||
}
|
||||
const Qt::CaseSensitivity caseSensitivity = (flags & QTextDocument::FindCaseSensitively) ? Qt::CaseSensitive : Qt::CaseInsensitive;
|
||||
const QRegExp expression(searchTerm, caseSensitivity);
|
||||
|
||||
QFile file;
|
||||
QString str;
|
||||
QTextStream stream;
|
||||
foreach(const QString &s, files) {
|
||||
if (future.isPaused()) {
|
||||
future.waitForResume();
|
||||
}
|
||||
if (future.isCanceled()) {
|
||||
future.setProgressValueAndText(numFilesSearched, msgCanceled(searchTerm, numMatches, numFilesSearched));
|
||||
break;
|
||||
}
|
||||
|
||||
bool needsToCloseFile = false;
|
||||
if (fileToContentsMap.contains(s)) {
|
||||
str = fileToContentsMap.value(s);
|
||||
stream.setString(&str);
|
||||
} else {
|
||||
file.setFileName(s);
|
||||
if (!file.open(QIODevice::ReadOnly)) {
|
||||
continue;
|
||||
}
|
||||
needsToCloseFile = true;
|
||||
stream.setDevice(&file);
|
||||
}
|
||||
int lineNr = 1;
|
||||
QString line;
|
||||
while (!stream.atEnd()) {
|
||||
line = stream.readLine();
|
||||
int pos = 0;
|
||||
while ((pos = expression.indexIn(line, pos)) != -1) {
|
||||
future.reportResult(FileSearchResult(s, lineNr, line,
|
||||
pos, expression.matchedLength()));
|
||||
pos += expression.matchedLength();
|
||||
}
|
||||
++lineNr;
|
||||
}
|
||||
++numFilesSearched;
|
||||
future.setProgressValueAndText(numFilesSearched, msgFound(searchTerm, numMatches, numFilesSearched, files.size()));
|
||||
if (needsToCloseFile) {
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
if (!future.isCanceled()) {
|
||||
future.setProgressValueAndText(numFilesSearched, msgFound(searchTerm, numMatches, numFilesSearched));
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
|
||||
QFuture<FileSearchResult> Utils::findInFiles(const QString &searchTerm, const QStringList &files,
|
||||
QTextDocument::FindFlags flags, QMap<QString, QString> fileToContentsMap)
|
||||
{
|
||||
return QtConcurrent::run<FileSearchResult, QString, QStringList, QTextDocument::FindFlags, QMap<QString, QString> >
|
||||
(runFileSearch, searchTerm, files, flags, fileToContentsMap);
|
||||
}
|
||||
|
||||
QFuture<FileSearchResult> Utils::findInFilesRegExp(const QString &searchTerm, const QStringList &files,
|
||||
QTextDocument::FindFlags flags, QMap<QString, QString> fileToContentsMap)
|
||||
{
|
||||
return QtConcurrent::run<FileSearchResult, QString, QStringList, QTextDocument::FindFlags, QMap<QString, QString> >
|
||||
(runFileSearchRegExp, searchTerm, files, flags, fileToContentsMap);
|
||||
}
|
@ -1,60 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file filesearch.h
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009.
|
||||
* @brief
|
||||
* @see The GNU Public License (GPL) Version 3
|
||||
* @defgroup
|
||||
* @{
|
||||
*
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef FILESEARCH_H
|
||||
#define FILESEARCH_H
|
||||
|
||||
#include "utils_global.h"
|
||||
|
||||
#include <QtCore/QStringList>
|
||||
#include <QtCore/QFuture>
|
||||
#include <QtCore/QMap>
|
||||
#include <QTextDocument>
|
||||
|
||||
namespace Utils {
|
||||
class QTCREATOR_UTILS_EXPORT FileSearchResult {
|
||||
public:
|
||||
FileSearchResult() {}
|
||||
FileSearchResult(QString fileName, int lineNumber, QString matchingLine, int matchStart, int matchLength)
|
||||
: fileName(fileName), lineNumber(lineNumber), matchingLine(matchingLine), matchStart(matchStart), matchLength(matchLength)
|
||||
{}
|
||||
QString fileName;
|
||||
int lineNumber;
|
||||
QString matchingLine;
|
||||
int matchStart;
|
||||
int matchLength;
|
||||
};
|
||||
|
||||
QTCREATOR_UTILS_EXPORT QFuture<FileSearchResult> findInFiles(const QString &searchTerm, const QStringList &files,
|
||||
QTextDocument::FindFlags flags, QMap<QString, QString> fileToContentsMap = QMap<QString, QString>());
|
||||
|
||||
QTCREATOR_UTILS_EXPORT QFuture<FileSearchResult> findInFilesRegExp(const QString &searchTerm, const QStringList &files,
|
||||
QTextDocument::FindFlags flags, QMap<QString, QString> fileToContentsMap = QMap<QString, QString>());
|
||||
} // namespace Utils
|
||||
|
||||
#endif // FILESEARCH_H
|
@ -14,7 +14,6 @@ DEFINES += PLUGIN_REL_PATH=$$shell_quote(\"$$relative_path($$GCS_PLUGIN_PATH, $$
|
||||
SOURCES += \
|
||||
reloadpromptutils.cpp \
|
||||
stringutils.cpp \
|
||||
filesearch.cpp \
|
||||
pathchooser.cpp \
|
||||
pathlisteditor.cpp \
|
||||
filewizardpage.cpp \
|
||||
@ -73,7 +72,6 @@ HEADERS += \
|
||||
utils_global.h \
|
||||
reloadpromptutils.h \
|
||||
stringutils.h \
|
||||
filesearch.h \
|
||||
listutils.h \
|
||||
pathchooser.h \
|
||||
pathlisteditor.h \
|
||||
|
Loading…
x
Reference in New Issue
Block a user