blob: 2e009c6a64bdf23841727a49be3e2df17d6017ff (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
// File: NCollection_Queue.hxx
// Created: 17.04.02 10:12:48
// Author: Alexander Kartomin (akm)
// <a-kartomin@opencascade.com>
// Copyright: Open Cascade 2002
#ifndef NCollection_Queue_HeaderFile
#define NCollection_Queue_HeaderFile
#include <NCollection_TListIterator.hxx>
#if !defined No_Exception && !defined No_Standard_NoSuchObject
#include <Standard_NoSuchObject.hxx>
#endif
#ifdef WNT
// Disable the warning "operator new unmatched by delete"
#pragma warning (disable:4291)
#endif
/**
* Purpose: A queue is a structure where Items are added at
* the end and removed from the front. The first
* entered Item will be the first removed. This is
* called a FIFO (First In First Out).
* Inherits BaseList, adds the data item to each node.
*/
template <class TheItemType> class NCollection_Queue
: public NCollection_BaseCollection<TheItemType>,
public NCollection_BaseList
{
public:
typedef NCollection_TListNode<TheItemType> QueueNode;
typedef NCollection_TListIterator<TheItemType> Iterator;
public:
// ---------- PUBLIC METHODS ------------
//! Constructor
NCollection_Queue(const Handle(NCollection_BaseAllocator)& theAllocator=0L) :
NCollection_BaseCollection<TheItemType>(theAllocator),
NCollection_BaseList() {}
//! Copy constructor
NCollection_Queue (const NCollection_Queue& theOther) :
NCollection_BaseCollection<TheItemType>(theOther.myAllocator),
NCollection_BaseList()
{ *this = theOther; }
//! Size - Number of items
virtual Standard_Integer Size (void) const
{ return Extent(); }
//! Length - number of items
Standard_Integer Length (void) const
{ return Extent(); }
//! Replace this list by the items of theOther collection
virtual void Assign (const NCollection_BaseCollection<TheItemType>& theOther)
{
if (this == &theOther)
return;
Clear();
TYPENAME NCollection_BaseCollection<TheItemType>::Iterator& anIter =
theOther.CreateIterator();
for (; anIter.More(); anIter.Next())
{
QueueNode* pNew = new (this->myAllocator) QueueNode(anIter.Value());
PAppend(pNew);
}
}
//! Replace this list by the items of theOther queue
NCollection_Queue& operator= (const NCollection_Queue& theOther)
{
if (this == &theOther)
return *this;
Clear ();
QueueNode * pCur = (QueueNode *) theOther.PFirst();
while (pCur)
{
QueueNode* pNew = new (this->myAllocator) QueueNode(pCur->Value());
PAppend(pNew);
pCur = (QueueNode *) pCur->Next();
}
return *this;
}
//! Clear this queue
void Clear (void)
{ PClear (QueueNode::delNode, this->myAllocator); }
//! Frontal item - constant
const TheItemType& Front (void) const
{
#if !defined No_Exception && !defined No_Standard_NoSuchObject
if (IsEmpty())
Standard_NoSuchObject::Raise ("NCollection_Queue::Front");
#endif
return ((const QueueNode *) PFirst())->Value();
}
//! Frontal item - variable
TheItemType& ChangeFront (void)
{
#if !defined No_Exception && !defined No_Standard_NoSuchObject
if (IsEmpty())
Standard_NoSuchObject::Raise ("NCollection_Queue::ChangeFront");
#endif
return ((QueueNode *) PFirst())->ChangeValue();
}
//! Push one item
void Push (const TheItemType& theItem)
{
QueueNode * pNew = new (this->myAllocator) QueueNode(theItem);
PAppend(pNew);
}
//! Pop first item
void Pop (void)
{ PRemoveFirst (QueueNode::delNode, this->myAllocator); }
//! Destructor - clears the List
~NCollection_Queue (void)
{ Clear(); }
private:
// ----------- PRIVATE METHODS -----------
//! Creates Iterator for use on BaseCollection
virtual TYPENAME NCollection_BaseCollection<TheItemType>::Iterator&
CreateIterator(void) const
{ return *(new (this->IterAllocator()) Iterator(*this)); }
};
#ifdef WNT
#pragma warning (default:4291)
#endif
#endif
|