/* -*- C++ -*- This file is part of ThreadWeaver, a KDE framework. SPDX-FileCopyrightText: 2013 Mirko Boehm SPDX-License-Identifier: LGPL-2.0-or-later */ #ifndef THREADWEAVER_QUEUEING_H #define THREADWEAVER_QUEUEING_H #include "collection.h" #include "jobinterface.h" #include "jobpointer.h" #include "lambda.h" #include "managedjobpointer.h" #include "qobjectdecorator.h" #include "queue.h" namespace ThreadWeaver { // make a job that calls a functor, anything that responds to operator() template QSharedPointer> make_job(T t) { QSharedPointer> ret(new Lambda(t)); return ret; } // make a job pointer holding a pointer to a Job(Interface) template inline QSharedPointer make_job(T *job) { JobInterface *test = static_cast(job); Q_UNUSED(test); return QSharedPointer(job); } // make a job pointer holding anything resembling JobInterface inline JobPointer make_job_raw(JobInterface *job) { return ManagedJobPointer(job); } // enqueue any functor type to the specified queue: template JobPointer enqueue(Queue *weaver, T t) { JobPointer ret = make_job(t); weaver->enqueue(ret); return ret; } template QSharedPointer enqueue(Queue *weaver, T *t) { JobInterface *test = static_cast(t); Q_UNUSED(test); QSharedPointer ret(make_job(t)); weaver->enqueue(ret); return ret; } // specialize for JobPointer: template<> inline JobPointer enqueue(Queue *weaver, JobPointer job) { weaver->enqueue(job); return job; } // convenience overload: enqueue the functor to the global queue: template JobPointer enqueue(T t) { return enqueue(Queue::instance(), t); } // enqueue a raw pointer with no memory management inline JobPointer enqueue_raw(Queue *weaver, JobInterface *job) { return enqueue(weaver, make_job_raw(job)); } // overload to enqueue to the global pool inline JobPointer enqueue_raw(JobInterface *job) { return enqueue(Queue::instance(), make_job_raw(job)); } } #endif // THREADWEAVER_QUEUEING_H