File indexing completed on 2024-04-28 04:20:53

0001 /* SPDX-FileCopyrightText: 2012 Jesper K. Pedersen <blackie@kde.org>
0002 
0003    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 */
0005 
0006 #include "PriorityQueue.h"
0007 
0008 #include <Utilities/AlgorithmHelper.h>
0009 
0010 #include <functional>
0011 
0012 using namespace Utilities;
0013 namespace BackgroundTaskManager
0014 {
0015 
0016 PriorityQueue::PriorityQueue()
0017 {
0018     m_jobs.resize(SIZE_OF_PRIORITY_QUEUE);
0019 }
0020 
0021 bool PriorityQueue::isEmpty() const
0022 {
0023     return all_of(m_jobs, std::mem_fn(&QueueType::isEmpty));
0024 }
0025 
0026 int PriorityQueue::count() const
0027 {
0028     return sum(m_jobs, std::mem_fn(&QueueType::length));
0029 }
0030 
0031 void PriorityQueue::enqueue(JobInterface *job, Priority priority)
0032 {
0033     m_jobs[priority].enqueue(job);
0034 }
0035 
0036 JobInterface *PriorityQueue::dequeue()
0037 {
0038     for (QueueType &queue : m_jobs) {
0039         if (!queue.isEmpty())
0040             return queue.dequeue();
0041     }
0042     Q_ASSERT(false && "Queue was empty");
0043     return nullptr;
0044 }
0045 
0046 JobInterface *PriorityQueue::peek(int index) const
0047 {
0048     int offset = 0;
0049     for (const QueueType &queue : m_jobs) {
0050         if (index - offset < queue.count())
0051             return queue[index - offset];
0052         else
0053             offset += queue.count();
0054     }
0055     Q_ASSERT(false && "index beyond queue");
0056     return nullptr;
0057 }
0058 
0059 bool PriorityQueue::hasForegroundTasks() const
0060 {
0061     for (int i = 0; i < BackgroundTask; ++i) {
0062         if (!m_jobs[i].isEmpty())
0063             return true;
0064     }
0065     return false;
0066 }
0067 
0068 } // namespace BackgroundTaskManager
0069 // vi:expandtab:tabstop=4 shiftwidth=4: