7fd59977 |
1 | // File: TCollection_Stack.gxx |
2 | // Created: Mon Jan 18 14:30:12 1993 |
3 | // Author: Remi LEQUETTE |
4 | // <rle@phylox> |
5 | |
6 | #include <Standard_NoSuchObject.hxx> |
7 | |
8 | //======================================================================= |
9 | //function : TCollection_Stack |
10 | //purpose : |
11 | //======================================================================= |
12 | |
13 | TCollection_Stack::TCollection_Stack() : |
14 | myTop(NULL), |
15 | myDepth(0) |
16 | { |
17 | } |
18 | |
19 | //======================================================================= |
20 | //function : TCollection_Stack |
21 | //purpose : |
22 | //======================================================================= |
23 | |
24 | TCollection_Stack::TCollection_Stack(const TCollection_Stack& Other) |
25 | { |
26 | if (!Other.IsEmpty()) { |
27 | cout << "WARNING copy constructor of non empty stack !"<<endl; |
28 | } |
29 | TCollection_StackNode* p = (TCollection_StackNode*) Other.myTop; |
30 | TCollection_StackNode* q; |
31 | TCollection_StackNode* r = NULL; |
32 | myTop = NULL; |
33 | while (p) { |
34 | q = new TCollection_StackNode(p->Value(),(TCollection_MapNode*)0L); |
35 | if (r) r->Next() = q; |
36 | else myTop = q; |
37 | r = q; |
38 | p = (TCollection_StackNode*)p->Next(); |
39 | } |
40 | myDepth = Other.myDepth; |
41 | } |
42 | |
43 | //======================================================================= |
44 | //function : Assign |
45 | //purpose : |
46 | //======================================================================= |
47 | |
48 | const TCollection_Stack& TCollection_Stack::Assign |
49 | (const TCollection_Stack& Other) |
50 | { |
51 | if (this == &Other) return *this; |
52 | Clear(); |
53 | TCollection_StackNode* p = (TCollection_StackNode*) Other.myTop; |
54 | TCollection_StackNode* q; |
55 | TCollection_StackNode* r = NULL; |
56 | while (p) { |
57 | q = new TCollection_StackNode(p->Value(),(TCollection_MapNode*)0L); |
58 | if (r) r->Next() = q; |
59 | else myTop = q; |
60 | r = q; |
61 | p = (TCollection_StackNode*)p->Next(); |
62 | } |
63 | myDepth = Other.myDepth; |
64 | return *this; |
65 | } |
66 | |
67 | |
68 | //======================================================================= |
69 | //function : Top |
70 | //purpose : |
71 | //======================================================================= |
72 | |
73 | const Item& TCollection_Stack::Top() const |
74 | { |
75 | Standard_NoSuchObject_Raise_if(IsEmpty(),"TCollection_Stack"); |
76 | return ((TCollection_StackNode*)myTop)->Value(); |
77 | } |
78 | |
79 | //======================================================================= |
80 | //function : Push |
81 | //purpose : |
82 | //======================================================================= |
83 | |
84 | void TCollection_Stack::Push(const Item& I) |
85 | { |
86 | myTop = new TCollection_StackNode(I,(TCollection_StackNode*)myTop); |
87 | myDepth++; |
88 | } |
89 | |
90 | //======================================================================= |
91 | //function : Pop |
92 | //purpose : |
93 | //======================================================================= |
94 | |
95 | void TCollection_Stack::Pop() |
96 | { |
97 | Standard_NoSuchObject_Raise_if(IsEmpty(),"TCollection_Stack"); |
98 | TCollection_StackNode* p = (TCollection_StackNode*) myTop; |
99 | myTop = p->Next(); |
100 | delete p; |
101 | myDepth--; |
102 | } |
103 | |
104 | //======================================================================= |
105 | //function : Clear |
106 | //purpose : |
107 | //======================================================================= |
108 | |
109 | void TCollection_Stack::Clear() |
110 | { |
111 | TCollection_StackNode* p = (TCollection_StackNode*) myTop; |
112 | TCollection_StackNode* q; |
113 | while(p) { |
114 | q = (TCollection_StackNode*)p->Next(); |
115 | delete p; |
116 | p = q; |
117 | } |
118 | myDepth = 0; |
119 | myTop = NULL; |
120 | } |
121 | |
122 | //======================================================================= |
123 | //function : ChangeTop |
124 | //purpose : |
125 | //======================================================================= |
126 | |
127 | Item& TCollection_Stack::ChangeTop() |
128 | { |
129 | Standard_NoSuchObject_Raise_if(IsEmpty(),"TCollection_Stack"); |
130 | return ((TCollection_StackNode*)myTop)->Value(); |
131 | } |
132 | |
133 | //======================================================================= |
134 | //function : Next |
135 | //purpose : |
136 | //======================================================================= |
137 | |
138 | void TCollection_StackIterator::Next() |
139 | { |
140 | current = ((TCollection_StackNode*)current)->Next(); |
141 | } |
142 | |
143 | //======================================================================= |
144 | //function : Value |
145 | //purpose : |
146 | //======================================================================= |
147 | |
148 | const Item& TCollection_StackIterator::Value() const |
149 | { |
150 | Standard_NoSuchObject_Raise_if(current == NULL, |
151 | "TCollection_StackIterator"); |
152 | return ((TCollection_StackNode*)current)->Value(); |
153 | } |