/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*! \class QFutureSynchronizer
    \since 4.4
    \inmodule QtCore

    \brief The QFutureSynchronizer class is a convenience class that simplifies
    QFuture synchronization.

    \ingroup thread

    QFutureSynchronizer is a template class that simplifies synchronization of
    one or more QFuture objects. Futures are added using the addFuture() or
    setFuture() functions. The futures() function returns a list of futures.
    Use clearFutures() to remove all futures from the QFutureSynchronizer.

    The waitForFinished() function waits for all futures to finish.
    The destructor of QFutureSynchronizer calls waitForFinished(), providing
    an easy way to ensure that all futures have finished before returning from
    a function:

    \snippet code/src_corelib_thread_qfuturesynchronizer.cpp 0

    The behavior of waitForFinished() can be changed using the
    setCancelOnWait() function. Calling setCancelOnWait(true) will cause
    waitForFinished() to cancel all futures before waiting for them to finish.
    You can query the status of the cancel-on-wait feature using the
    cancelOnWait() function.

    \sa QFuture, QFutureWatcher, {Qt Concurrent}
*/

/*!
    \fn template <typename T> QFutureSynchronizer<T>::QFutureSynchronizer()

    Constructs a QFutureSynchronizer.
*/

/*!
    \fn template <typename T> QFutureSynchronizer<T>::QFutureSynchronizer(const QFuture<T> &future)

    Constructs a QFutureSynchronizer and begins watching \a future by calling
    addFuture().

    \sa addFuture()
*/

/*!
    \fn template <typename T> QFutureSynchronizer<T>::~QFutureSynchronizer()

    Calls waitForFinished() function to ensure that all futures have finished
    before destroying this QFutureSynchronizer.

    \sa waitForFinished()
*/

/*!
    \fn template <typename T> void QFutureSynchronizer<T>::setFuture(const QFuture<T> &future)

    Sets \a future to be the only future managed by this QFutureSynchronizer.
    This is a convenience function that calls waitForFinished(),
    then clearFutures(), and finally passes \a future to addFuture().

    \sa addFuture(), waitForFinished(), clearFutures()
*/

/*!
    \fn template <typename T> void QFutureSynchronizer<T>::addFuture(const QFuture<T> &future)

    Adds \a future to the list of managed futures.

    \sa futures()
*/

/*!
    \fn template <typename T> void QFutureSynchronizer<T>::waitForFinished()

    Waits for all futures to finish. If cancelOnWait() returns \c true, each
    future is canceled before waiting for them to finish.

    \sa cancelOnWait(), setCancelOnWait()
*/

/*!
    \fn template <typename T> void QFutureSynchronizer<T>::clearFutures()

    Removes all managed futures from this QFutureSynchronizer.

    \sa addFuture(), setFuture()
*/

/*!
    \fn template <typename T> QList<QFuture<T> > QFutureSynchronizer<T>::futures() const

    Returns a list of all managed futures.

    \sa addFuture(), setFuture()
*/

/*!
    \fn template <typename T> void QFutureSynchronizer<T>::setCancelOnWait(bool enabled)

    Enables or disables the cancel-on-wait feature based on the \a enabled
    argument. If \a enabled is true, the waitForFinished() function will cancel
    all futures before waiting for them to finish.

    \sa waitForFinished()
*/

/*!
    \fn template <typename T> bool QFutureSynchronizer<T>::cancelOnWait() const

    Returns \c true if the cancel-on-wait feature is enabled; otherwise returns
    false. If cancel-on-wait is enabled, the waitForFinished() function will
    cancel all futures before waiting for them to finish.

    \sa waitForFinished()
*/
