Nebula
Toggle main menu visibility
Loading...
Searching...
No Matches
safepriorityqueue.h
Go to the documentation of this file.
1
#pragma once
2
//------------------------------------------------------------------------------
14
#include "
util/queue.h
"
15
#include "
threading/criticalsection.h
"
16
#include "
threading/event.h
"
17
18
//------------------------------------------------------------------------------
19
namespace
Threading
20
{
21
template
<
class
PRITYPE,
class
TYPE>
class
SafePriorityQueue
:
protected
Util::Queue
<Util::KeyValuePair<PRITYPE, TYPE> >
22
{
23
public
:
25
SafePriorityQueue
();
27
SafePriorityQueue
(
const
SafePriorityQueue<PRITYPE,TYPE>
& rhs);
28
30
void
operator=
(
const
SafePriorityQueue<PRITYPE,TYPE>
& rhs);
32
SizeT
Size
()
const
;
34
bool
IsEmpty
()
const
;
36
void
Clear
();
37
39
void
Insert
(PRITYPE pri,
const
TYPE& e);
41
void
EraseMatchingElements
(
const
TYPE& e);
43
TYPE
Dequeue
();
45
TYPE
Peek
()
const
;
47
void
Wait
();
49
void
Signal
();
50
51
protected
:
52
CriticalSection
criticalSection
;
53
Event
enqueueEvent
;
54
};
55
56
//------------------------------------------------------------------------------
59
template
<
class
PRITYPE,
class
TYPE>
60
SafePriorityQueue<PRITYPE,TYPE>::SafePriorityQueue
()
61
{
62
// empty
63
}
64
65
//------------------------------------------------------------------------------
68
template
<
class
PRITYPE,
class
TYPE>
69
SafePriorityQueue<PRITYPE,TYPE>::SafePriorityQueue
(
const
SafePriorityQueue<PRITYPE,TYPE>
& rhs)
70
{
71
this->
criticalSection
.Enter();
72
this->queueArray = rhs.queueArray;
73
this->
criticalSection
.Leave();
74
}
75
76
//------------------------------------------------------------------------------
79
template
<
class
PRITYPE,
class
TYPE>
void
80
SafePriorityQueue<PRITYPE,TYPE>::operator=
(
const
SafePriorityQueue<PRITYPE,TYPE>
& rhs)
81
{
82
this->
criticalSection
.Enter();
83
this->queueArray = rhs.queueArray;
84
this->
criticalSection
.Leave();
85
}
86
87
//------------------------------------------------------------------------------
90
template
<
class
PRITYPE,
class
TYPE>
void
91
SafePriorityQueue<PRITYPE,TYPE>::Clear
()
92
{
93
this->
criticalSection
.Enter();
94
this->queueArray.Clear();
95
this->
criticalSection
.Leave();
96
}
97
98
//------------------------------------------------------------------------------
101
template
<
class
PRITYPE,
class
TYPE>
SizeT
102
SafePriorityQueue<PRITYPE,TYPE>::Size
()
const
103
{
104
return
this->queueArray.Size();
105
}
106
107
//------------------------------------------------------------------------------
110
template
<
class
PRITYPE,
class
TYPE>
bool
111
SafePriorityQueue<PRITYPE,TYPE>::IsEmpty
()
const
112
{
113
return
this->queueArray.IsEmpty();
114
}
115
116
//------------------------------------------------------------------------------
119
template
<
class
PRITYPE,
class
TYPE>
void
120
SafePriorityQueue<PRITYPE,TYPE>::Insert
(PRITYPE pri,
const
TYPE& e)
121
{
122
Util::KeyValuePair<PRITYPE, TYPE>
kvp(pri, e);
123
this->
criticalSection
.Enter();
124
this->queueArray.InsertSorted(kvp);
125
this->
criticalSection
.Leave();
126
this->
enqueueEvent
.Signal();
127
}
128
129
//------------------------------------------------------------------------------
132
template
<
class
PRITYPE,
class
TYPE>
void
133
SafePriorityQueue<PRITYPE,TYPE>::EraseMatchingElements
(
const
TYPE& e)
134
{
135
this->
criticalSection
.Enter();
136
//Util::Array<Util::KeyValuePair<PRITYPE,TYPE> >::Iterator iter;
137
for
(
auto
iter = this->queueArray.Begin(); iter != this->queueArray.End();)
138
{
139
if
((*iter).Value() == e)
140
{
141
iter = this->queueArray.Erase(iter);
142
}
143
else
144
{
145
iter++;
146
}
147
}
148
this->
criticalSection
.Leave();
149
}
150
151
//------------------------------------------------------------------------------
154
template
<
class
PRITYPE,
class
TYPE> TYPE
155
SafePriorityQueue<PRITYPE,TYPE>::Dequeue
()
156
{
157
this->
criticalSection
.Enter();
158
TYPE value = this->queueArray.Front().Value();
159
this->queueArray.EraseIndex(0);
160
this->
criticalSection
.Leave();
161
return
value;
162
}
163
164
//------------------------------------------------------------------------------
167
template
<
class
PRITYPE,
class
TYPE> TYPE
168
SafePriorityQueue<PRITYPE,TYPE>::Peek
()
const
169
{
170
this->
criticalSection
.Enter();
171
TYPE value = this->queueArray.Front().Value();
172
this->
criticalSection
.Leave();
173
return
value;
174
}
175
176
//------------------------------------------------------------------------------
179
template
<
class
PRITYPE,
class
TYPE>
void
180
SafePriorityQueue<PRITYPE,TYPE>::Wait
()
181
{
182
if
(this->queueArray.Size() == 0)
183
{
184
this->
enqueueEvent
.Wait();
185
}
186
}
187
188
//------------------------------------------------------------------------------
194
template
<
class
PRITYPE,
class
TYPE>
void
195
SafePriorityQueue<PRITYPE,TYPE>::Signal
()
196
{
197
this->
enqueueEvent
.Signal();
198
}
199
200
}
// namespace Threading
201
//------------------------------------------------------------------------------
CriticalSection
Critical section objects are used to protect a portion of code from parallel execution.
Event
Threading::SafePriorityQueue::Signal
void Signal()
signal the internal event, so that Wait() will return
Definition
safepriorityqueue.h:195
Threading::SafePriorityQueue::IsEmpty
bool IsEmpty() const
return true if queue is empty
Definition
safepriorityqueue.h:111
Threading::SafePriorityQueue::SafePriorityQueue
SafePriorityQueue()
constructor
Definition
safepriorityqueue.h:60
Threading::SafePriorityQueue::Size
SizeT Size() const
returns number of elements in the queue
Definition
safepriorityqueue.h:102
Threading::SafePriorityQueue::criticalSection
CriticalSection criticalSection
Definition
safepriorityqueue.h:52
Threading::SafePriorityQueue::EraseMatchingElements
void EraseMatchingElements(const TYPE &e)
erase all matching elements
Definition
safepriorityqueue.h:133
Threading::SafePriorityQueue::Dequeue
TYPE Dequeue()
remove the element from the front of the queue
Definition
safepriorityqueue.h:155
Threading::SafePriorityQueue::Peek
TYPE Peek() const
get copy of element at front of queue without removing it
Definition
safepriorityqueue.h:168
Threading::SafePriorityQueue::enqueueEvent
Event enqueueEvent
Definition
safepriorityqueue.h:53
Threading::SafePriorityQueue::Clear
void Clear()
remove all elements from the queue
Definition
safepriorityqueue.h:91
Threading::SafePriorityQueue::operator=
void operator=(const SafePriorityQueue< PRITYPE, TYPE > &rhs)
assignment operator
Definition
safepriorityqueue.h:80
Threading::SafePriorityQueue::Insert
void Insert(PRITYPE pri, const TYPE &e)
add element to the back of the queue
Definition
safepriorityqueue.h:120
Threading::SafePriorityQueue::Wait
void Wait()
wait until queue contains at least one element
Definition
safepriorityqueue.h:180
Util::KeyValuePair
Key/Value pair objects are used by most assiociative container classes, like Dictionary or HashTable.
Definition
keyvaluepair.h:19
Util::Queue
Nebula's queue class (a FIFO container).
Definition
queue.h:22
criticalsection.h
event.h
Threading
The Jobs2 system provides a set of threads and a pool of jobs from which threads can pickup work.
Definition
jobs2.h:16
queue.h
SizeT
int SizeT
Definition
types.h:42
code
foundation
threading
safepriorityqueue.h
Generated on
for Nebula. Dark theme by
Tilen Majerle
. All rights reserved.