File indexing completed on 2024-04-28 04:01:23

0001 /* -*- C++ -*-
0002     This file is part of ThreadWeaver, a KDE framework.
0003 
0004     SPDX-FileCopyrightText: 2013 Mirko Boehm <mirko@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #include <QList>
0010 
0011 #include "queue.h"
0012 #include "queueing.h"
0013 #include "queuestream.h"
0014 
0015 namespace ThreadWeaver
0016 {
0017 class Q_DECL_HIDDEN QueueStream::Private
0018 {
0019 public:
0020     Private(Queue *w)
0021         : weaver(w)
0022     {
0023     }
0024     Queue *weaver;
0025     QList<JobPointer> jobs;
0026 };
0027 
0028 QueueStream::QueueStream(Queue *queue)
0029     : d(new Private(queue))
0030 {
0031     Q_ASSERT(queue);
0032 }
0033 
0034 QueueStream::~QueueStream()
0035 {
0036     flush();
0037     delete d;
0038 }
0039 
0040 void ThreadWeaver::QueueStream::add(const ThreadWeaver::JobPointer &job)
0041 {
0042     d->jobs.append(job);
0043 }
0044 
0045 void QueueStream::flush()
0046 {
0047     if (d->jobs.isEmpty()) {
0048         return;
0049     }
0050     Q_ASSERT(d->weaver);
0051     d->weaver->enqueue(d->jobs);
0052     d->jobs.clear();
0053 }
0054 
0055 QueueStream &QueueStream::operator<<(const JobPointer &job)
0056 {
0057     add(job);
0058     return *this;
0059 }
0060 
0061 QueueStream &QueueStream::operator<<(JobInterface *job)
0062 {
0063     add(make_job(job));
0064     return *this;
0065 }
0066 
0067 QueueStream &QueueStream::operator<<(Job &job)
0068 {
0069     add(make_job_raw(&job));
0070     return *this;
0071 }
0072 
0073 /** @brief Return a stream the enqueues jobs in the ThreadWeaver global queue.
0074  *  Using this is synonymous to Weaver::instance()::stream(). */
0075 QueueStream stream()
0076 {
0077     return QueueStream(Queue::instance());
0078 }
0079 
0080 }