Turned Scheduler into more generic heap
This commit is contained in:
78
src/heap.cpp
Normal file
78
src/heap.cpp
Normal file
@@ -0,0 +1,78 @@
|
||||
#include "heap.hpp"
|
||||
|
||||
template<class T>
|
||||
kernelns::Heap<T>::Heap()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
template<class T>
|
||||
kernelns::Heap<T>::Heap(T** array, size_t maxSize)
|
||||
{
|
||||
m_array = array;
|
||||
m_size = 0;
|
||||
m_limit = maxSize;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
T* kernelns::Heap<T>::extractMin()
|
||||
{
|
||||
if(m_size == 0)
|
||||
return nullptr;
|
||||
m_size--;
|
||||
T* p = m_array[0];
|
||||
m_array[0] = m_array[m_size];
|
||||
heapify(0);
|
||||
return p;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void kernelns::Heap<T>::insert(T* n)
|
||||
{
|
||||
if(m_size == m_limit) // TODO: have insert return status code
|
||||
return;
|
||||
size_t i = m_size;
|
||||
m_size++;
|
||||
while(i > 0 && *m_array[(i - 1) / 2] > *n)
|
||||
{
|
||||
m_array[i] = m_array[(i - 1) / 2];
|
||||
i = (i - 1) / 2;
|
||||
}
|
||||
m_array[i] = n;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void kernelns::Heap<T>::remove(T* n)
|
||||
{
|
||||
for(size_t i = 0; i < m_size; i++)
|
||||
{
|
||||
if(m_array[i] == n)
|
||||
{
|
||||
m_size--;
|
||||
m_array[i] = m_array[m_size];
|
||||
heapify(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void kernelns::Heap<T>::heapify(size_t i)
|
||||
{
|
||||
if(i * 2 + 1 >= m_size)
|
||||
return;
|
||||
if (*m_array[i * 2 + 1] <= *m_array[i] && *m_array[i * 2 + 1] <= *m_array[i * 2 + 2])
|
||||
{
|
||||
T buffer = m_array[i];
|
||||
m_array[i] = m_array[i * 2 + 1];
|
||||
m_array[i * 2 + 1] = buffer;
|
||||
heapify(i * 2 + 1);
|
||||
}
|
||||
else if (*m_array[i * 2 + 2] <= *m_array[i] && *m_array[i * 2 + 2] <= *m_array[i * 2 + 1])
|
||||
{
|
||||
T buffer = m_array[i];
|
||||
m_array[i] = m_array[i * 2 + 2];
|
||||
m_array[i * 2 + 2] = buffer;
|
||||
heapify(i * 2 + 2);
|
||||
}
|
||||
}
|
||||
38
src/heap.hpp
Normal file
38
src/heap.hpp
Normal file
@@ -0,0 +1,38 @@
|
||||
#ifndef SCHEDULER_H
|
||||
#define SCHEDULER_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "process.hpp"
|
||||
|
||||
namespace kernelns
|
||||
{
|
||||
|
||||
template<class T>
|
||||
class Heap
|
||||
{
|
||||
public:
|
||||
|
||||
Heap();
|
||||
|
||||
Heap(T** array, size_t maxSize);
|
||||
|
||||
T* extractMin();
|
||||
|
||||
void insert(T* n);
|
||||
|
||||
void remove(T* n);
|
||||
|
||||
private:
|
||||
|
||||
void heapify(size_t index);
|
||||
|
||||
T** m_array;
|
||||
|
||||
size_t m_size, m_limit;
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,68 +0,0 @@
|
||||
#include "scheduler.hpp"
|
||||
|
||||
kernelns::ProcessQueue::ProcessQueue()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
kernelns::ProcessQueue::ProcessQueue(Process** array)
|
||||
{
|
||||
m_array = array;
|
||||
m_size = 0;
|
||||
}
|
||||
|
||||
kernelns::Process* kernelns::ProcessQueue::extractMin()
|
||||
{
|
||||
if(m_size == 0)
|
||||
return NULL;
|
||||
m_size--;
|
||||
Process* p = m_array[0];
|
||||
m_array[0] = m_array[m_size];
|
||||
heapify(0);
|
||||
return p;
|
||||
}
|
||||
|
||||
void kernelns::ProcessQueue::insert(Process* n)
|
||||
{
|
||||
size_t i = m_size;
|
||||
m_size++;
|
||||
for(; i > 0 && m_array[(i - 1) / 2]->priority > n->priority; i = (i - 1) / 2)
|
||||
{
|
||||
m_array[i] = m_array[(i - 1) / 2];
|
||||
}
|
||||
m_array[i] = n;
|
||||
}
|
||||
|
||||
void kernelns::ProcessQueue::remove(Process* n)
|
||||
{
|
||||
for(size_t i = 0; i < m_size; i++)
|
||||
{
|
||||
if(m_array[i] == n)
|
||||
{
|
||||
m_size--;
|
||||
m_array[i] = m_array[m_size];
|
||||
heapify(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void kernelns::ProcessQueue::heapify(size_t i)
|
||||
{
|
||||
if(i * 2 + 1 >= m_size)
|
||||
return;
|
||||
if (m_array[i]->priority >= m_array[i * 2 + 1]->priority && m_array[i * 2 + 1]->priority <= m_array[i * 2 + 2]->priority)
|
||||
{
|
||||
Process* buffer = m_array[i];
|
||||
m_array[i] = m_array[i * 2 + 1];
|
||||
m_array[i * 2 + 1] = buffer;
|
||||
heapify(i * 2 + 1);
|
||||
}
|
||||
else if (m_array[i]->priority >= m_array[i * 2 + 2]->priority && m_array[i * 2 + 2]->priority <= m_array[i * 2 + 1]->priority)
|
||||
{
|
||||
Process* buffer = m_array[i];
|
||||
m_array[i] = m_array[i * 2 + 2];
|
||||
m_array[i * 2 + 2] = buffer;
|
||||
heapify(i * 2 + 2);
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
#ifndef SCHEDULER_H
|
||||
#define SCHEDULER_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "process.hpp"
|
||||
|
||||
namespace kernelns
|
||||
{
|
||||
|
||||
class ProcessQueue
|
||||
{
|
||||
public:
|
||||
|
||||
ProcessQueue();
|
||||
|
||||
ProcessQueue(Process** array);
|
||||
|
||||
Process* extractMin();
|
||||
|
||||
void insert(Process* n);
|
||||
|
||||
void remove(Process* n);
|
||||
|
||||
private:
|
||||
|
||||
void heapify(size_t index);
|
||||
|
||||
Process** m_array;
|
||||
|
||||
size_t m_size;
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user