Xbase64 4.0.1
C++ Library for handling Xbase (DBF) format type files
xblnklst.h
Go to the documentation of this file.
1/* xblnklst.h
2
3XBase64 Software Library
4
5Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
6
7The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
8
9Email Contact:
10
11 XDB-devel@lists.sourceforge.net
12 XDB-users@lists.sourceforge.net
13
14*/
15
16
17#ifndef __XB_XBLNKLST_H__
18#define __XB_XBLNKLST_H__
19
20#ifdef XB_LINKLIST_SUPPORT
21
22namespace xb{
23
24
25template<class xbNodeType>
26class XBDLLEXPORT xbLinkList {
27 public:
28 xbLinkList();
29 ~xbLinkList();
30
31 xbLinkListNode<xbNodeType> *GetHeadNode() const;
32 xbLinkListNode<xbNodeType> *GetEndNode() const;
33 xbLinkListNode<xbNodeType> *GetNodeForNo( xbUInt32 ulNodeNo ) const;
34
35 void Clear();
36 xbUInt32 GetNodeCnt () const;
37 xbInt16 InsertAtEnd ( const xbNodeType &xbLLN );
38 xbInt16 InsertAtFront ( const xbNodeType &xbLLN );
39 xbInt16 RemoveByVal ( const xbNodeType &xbLLN );
40 xbInt16 RemoveFromEnd ();
41 xbInt16 RemoveFromEnd ( xbNodeType &xbLLN );
42 xbInt16 RemoveFromFront( xbNodeType &xbLLN );
43 xbInt16 SearchFor ( const xbNodeType &xbLLN );
44
45 private:
46 xbUInt32 ulNodeCnt;
47 xbLinkListNode<xbNodeType> *llStartPtr;
48 xbLinkListNode<xbNodeType> *llEndPtr;
49};
50
51template<class xbNodeType>
52xbLinkList<xbNodeType>::xbLinkList(){
53 ulNodeCnt = 0;
54 llStartPtr = NULL;
55 llEndPtr = NULL;
56}
57
58template<class xbNodeType>
59xbLinkList<xbNodeType>::~xbLinkList(){
60 Clear();
61}
62
63template<class xbNodeType>
64void xbLinkList<xbNodeType>::Clear(){
65 xbLinkListNode<xbNodeType> *cPtr = llStartPtr, *tPtr;
66 for( xbUInt32 i = 0; i < ulNodeCnt; i++ ){
67 tPtr = cPtr;
68 cPtr = cPtr->GetNextNode();
69 delete tPtr;
70 }
71 ulNodeCnt = 0;
72 llStartPtr = NULL;
73 llEndPtr = NULL;
74}
75
76
77template<class xbNodeType>
78xbLinkListNode<xbNodeType> *xbLinkList<xbNodeType>::GetHeadNode() const{
79 return llStartPtr;
80}
81
82template<class xbNodeType>
83xbLinkListNode<xbNodeType> *xbLinkList<xbNodeType>::GetEndNode() const{
84 return llEndPtr;
85}
86
87
88template<class xbNodeType>
89xbLinkListNode<xbNodeType> *xbLinkList<xbNodeType>::GetNodeForNo( xbUInt32 ulNo ) const{
90
91 xbLinkListNode<xbNodeType> *cPtr = llStartPtr;
92 xbUInt32 i;
93 for( i = 0; i < ulNo && i < ulNodeCnt; i++ )
94 cPtr = cPtr->GetNextNode();
95
96 if( i == ulNo )
97 return cPtr;
98 else
99 return 0;
100}
101
102
103
104template<class xbNodeType>
105xbUInt32 xbLinkList<xbNodeType>::GetNodeCnt() const{
106 return ulNodeCnt;
107}
108
109template<class xbNodeType>
110xbInt16 xbLinkList<xbNodeType>::InsertAtFront( const xbNodeType & ntKey ){
111
112 xbLinkListNode<xbNodeType> *p = new xbLinkListNode<xbNodeType>( ntKey );
113 if( p == 0 )
114 return XB_NO_MEMORY;
115
116 if( ulNodeCnt > 0 ){
117 llStartPtr->SetPrevNode( p );
118 p->SetNextNode( llStartPtr );
119 } else {
120 llEndPtr = p;
121 }
122
123 llStartPtr = p;
124 ulNodeCnt++;
125 return XB_NO_ERROR;
126}
127
128template<class xbNodeType>
129xbInt16 xbLinkList<xbNodeType>::InsertAtEnd( const xbNodeType & ntKey ){
130
131 xbLinkListNode<xbNodeType> *p = new xbLinkListNode<xbNodeType>( ntKey );
132 if( p == 0 )
133 return XB_NO_MEMORY;
134
135 if( ulNodeCnt > 0 ){
136 llEndPtr->SetNextNode( p );
137 p->SetPrevNode( llEndPtr );
138 llEndPtr = p;
139 } else {
140 llStartPtr = p;
141 }
142
143 llEndPtr = p;
144 ulNodeCnt++;
145 return XB_NO_ERROR;
146}
147
148
149
150template<class xbNodeType>
151xbInt16 xbLinkList<xbNodeType>::RemoveByVal( const xbNodeType & ntKey ){
152 // Remove the first instance of ntKey from the node chain
153 xbLinkListNode<xbNodeType> *currPtr = llStartPtr;
154 xbLinkListNode<xbNodeType> *prevPtr = NULL;
155
156 for( xbUInt32 i = 0; i < ulNodeCnt; i++ ){
157 if( currPtr->GetKey() == ntKey ){
158 if( prevPtr == NULL ){ //then this is the first node
159 llStartPtr = currPtr->GetNextNode();
160 if( llStartPtr ) // if more than one link in the linked list
161 llStartPtr->SetPrevNode( NULL );
162 delete currPtr;
163 ulNodeCnt--;
164 return i + 1;
165 }
166 else {
167 prevPtr->SetNextNode( currPtr->GetNextNode());
168 if( currPtr->GetNextNode())
169 currPtr->GetNextNode()->SetPrevNode( prevPtr );
170 delete currPtr;
171 ulNodeCnt--;
172 return i + 1;
173 }
174 }
175 prevPtr = currPtr;
176 currPtr = currPtr->GetNextNode();
177 }
178 return XB_NOT_FOUND;
179}
180
181
182template<class xbNodeType>
183xbInt16 xbLinkList<xbNodeType>::RemoveFromFront( xbNodeType & ntKey ){
184
185 if( ulNodeCnt <= 0 )
186 return XB_INVALID_NODELINK;
187 xbLinkListNode<xbNodeType> *p = llStartPtr;
188 llStartPtr = p->GetNextNode();
189 if( llStartPtr )
190 llStartPtr->SetPrevNode( NULL );
191 ntKey = p->GetKey();
192 delete p;
193 ulNodeCnt--;
194 return XB_NO_ERROR;
195}
196
197
198template<class xbNodeType>
199xbInt16 xbLinkList<xbNodeType>::RemoveFromEnd( xbNodeType & ntKey ){
200
201 if( ulNodeCnt <= 0 )
202 return XB_INVALID_NODELINK;
203 xbLinkListNode<xbNodeType> *p = llEndPtr;
204 if( p->GetPrevNode()){
205 llEndPtr = p->GetPrevNode();
206 llEndPtr->SetNextNode( NULL );
207 } else {
208 // there are no more nodes
209 llStartPtr = NULL;
210 llEndPtr = NULL;
211 }
212 ntKey = p->GetKey();
213 delete p;
214 ulNodeCnt--;
215 return XB_NO_ERROR;
216}
217
218
219template<class xbNodeType>
220xbInt16 xbLinkList<xbNodeType>::RemoveFromEnd(){
221
222 if( ulNodeCnt <= 0 )
223 return XB_INVALID_NODELINK;
224 xbLinkListNode<xbNodeType> *p = llEndPtr;
225 if( p->GetPrevNode()){
226 llEndPtr = p->GetPrevNode();
227 llEndPtr->SetNextNode( NULL );
228 } else {
229 // there are no more nodes
230 llStartPtr = NULL;
231 llEndPtr = NULL;
232 }
233 delete p->GetKey();
234 delete p;
235 ulNodeCnt--;
236 return XB_NO_ERROR;
237}
238
239
240template<class xbNodeType>
241xbInt16 xbLinkList<xbNodeType>::SearchFor( const xbNodeType & ntKey ){
242
243 xbLinkListNode<xbNodeType> *cPtr = llStartPtr;
244 for( xbUInt32 i = 0; i < ulNodeCnt; i++ ){
245 if( cPtr->GetKey() == ntKey )
246 return i+1;
247 cPtr = cPtr->GetNextNode();
248 }
249 return XB_NO_ERROR;
250
251}
252} // namespace
253
254#endif // XB_LINKLIST_SUPPORT
255#endif // XB_XBLNKLST_H__
256
257
Definition: xbdate.cpp:19
#define XB_INVALID_NODELINK
Definition: xbretcod.h:29
#define XB_NOT_FOUND
Definition: xbretcod.h:41
#define XB_NO_ERROR
Definition: xbretcod.h:24
#define XB_NO_MEMORY
Definition: xbretcod.h:25