xref: /aoo42x/main/autodoc/inc/cosv/tpl/swelist.hxx (revision 8a106958)
1ac3d0c65SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3ac3d0c65SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4ac3d0c65SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5ac3d0c65SAndrew Rist  * distributed with this work for additional information
6ac3d0c65SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7ac3d0c65SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8ac3d0c65SAndrew Rist  * "License"); you may not use this file except in compliance
9ac3d0c65SAndrew Rist  * with the License.  You may obtain a copy of the License at
10ac3d0c65SAndrew Rist  *
11ac3d0c65SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12ac3d0c65SAndrew Rist  *
13ac3d0c65SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14ac3d0c65SAndrew Rist  * software distributed under the License is distributed on an
15ac3d0c65SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16ac3d0c65SAndrew Rist  * KIND, either express or implied.  See the License for the
17ac3d0c65SAndrew Rist  * specific language governing permissions and limitations
18ac3d0c65SAndrew Rist  * under the License.
19ac3d0c65SAndrew Rist  *
20ac3d0c65SAndrew Rist  *************************************************************/
21ac3d0c65SAndrew Rist 
22ac3d0c65SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef CSV_SWELIST_HXX
25cdf0e10cSrcweir #define CSV_SWELIST_HXX
26cdf0e10cSrcweir 
27cdf0e10cSrcweir // USED SERVICES
28cdf0e10cSrcweir 	// BASE CLASSES
29cdf0e10cSrcweir 	// COMPONENTS
30cdf0e10cSrcweir 	// PARAMETERS
31cdf0e10cSrcweir #include <cosv/tpl/dyn.hxx>
32cdf0e10cSrcweir 
33cdf0e10cSrcweir 
34cdf0e10cSrcweir namespace csv
35cdf0e10cSrcweir {
36cdf0e10cSrcweir 
37cdf0e10cSrcweir 
38cdf0e10cSrcweir template <class XX>
39cdf0e10cSrcweir class SweListElement
40cdf0e10cSrcweir {
41cdf0e10cSrcweir   public:
42cdf0e10cSrcweir 	typedef SweListElement<XX> self;
43cdf0e10cSrcweir 
SweListElement(const XX & in_aObj)44cdf0e10cSrcweir 						SweListElement(
45cdf0e10cSrcweir 							const XX &			in_aObj )
46cdf0e10cSrcweir 												:	aObj(in_aObj), pNext(0)	{}
47cdf0e10cSrcweir 
Obj() const48cdf0e10cSrcweir 	const XX &			Obj() const				{ return aObj; }
Obj()49cdf0e10cSrcweir 	XX &		    	Obj()					{ return aObj; }
Next() const50cdf0e10cSrcweir 	self *	            Next() const			{ return pNext; }
51cdf0e10cSrcweir 
SetNext(self * i_pNext)52cdf0e10cSrcweir 	void				SetNext(
53cdf0e10cSrcweir 							self *              i_pNext )
54cdf0e10cSrcweir 												{ pNext = i_pNext; }
55cdf0e10cSrcweir   private:
56cdf0e10cSrcweir 	XX					aObj;
57cdf0e10cSrcweir 	self *				pNext;
58cdf0e10cSrcweir };
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 
61cdf0e10cSrcweir 
62cdf0e10cSrcweir template <class XX>  class SweListIterator;
63cdf0e10cSrcweir template <class XX>  class SweListCIterator;
64cdf0e10cSrcweir 
65cdf0e10cSrcweir 
66cdf0e10cSrcweir template <class XX>
67cdf0e10cSrcweir class SweList
68cdf0e10cSrcweir {
69cdf0e10cSrcweir   public:
70cdf0e10cSrcweir 	// TYPES
71cdf0e10cSrcweir 	typedef SweList<XX>				self;
72cdf0e10cSrcweir 	typedef XX						value_type;
73cdf0e10cSrcweir 	typedef SweListIterator<XX> 	iterator;
74cdf0e10cSrcweir 	typedef SweListCIterator<XX>    const_iterator;
75cdf0e10cSrcweir   private:
76cdf0e10cSrcweir 	typedef SweListElement<XX>      elem;
77cdf0e10cSrcweir 
78cdf0e10cSrcweir   public:
79cdf0e10cSrcweir 	// LIFECYCLE
SweList()80cdf0e10cSrcweir 						SweList()				: pTop(0), pTail(0) {}
~SweList()81cdf0e10cSrcweir 						~SweList()				{ erase_all(); }
82cdf0e10cSrcweir 	// OPERATIONS
83cdf0e10cSrcweir 	void		   		push_front(
84cdf0e10cSrcweir 							const XX &			i_aObj );
85cdf0e10cSrcweir 	void				pop_front();
86cdf0e10cSrcweir 	void		   		push_back(
87cdf0e10cSrcweir 							const XX &			i_aObj );
88cdf0e10cSrcweir 	void				erase_all();
89cdf0e10cSrcweir 
90cdf0e10cSrcweir 	// INQUIRY
begin() const91cdf0e10cSrcweir 	const_iterator		begin() const       	{ return pTop; }
begin()92cdf0e10cSrcweir 	iterator			begin()                 { return pTop; }
end() const93cdf0e10cSrcweir 	const_iterator		end() const             { return (elem*)0; }
end()94cdf0e10cSrcweir 	iterator			end()                   { return (elem*)0; }
front() const95cdf0e10cSrcweir 	const XX &			front() const      	    { return pTop->Obj(); }
front()96cdf0e10cSrcweir 	XX &				front()	                { return pTop->Obj(); }
back() const97cdf0e10cSrcweir 	const XX &			back() const            { return pTail->Obj(); }
back()98cdf0e10cSrcweir 	XX &				back()	          	    { return pTail->Obj(); }
99cdf0e10cSrcweir 
empty() const100cdf0e10cSrcweir 	bool				empty() const           { return pTop == 0; }
101cdf0e10cSrcweir 	uintt				size() const;
102cdf0e10cSrcweir 
103cdf0e10cSrcweir 
104cdf0e10cSrcweir   private:
105cdf0e10cSrcweir 	// Forbiddden methods.
106cdf0e10cSrcweir 						SweList(
107cdf0e10cSrcweir 							const self &		i_rList );
108cdf0e10cSrcweir 	self &				operator=(
109cdf0e10cSrcweir 							const self &		i_rList );
110cdf0e10cSrcweir 
111cdf0e10cSrcweir 	// DATA
112cdf0e10cSrcweir 	DYN elem *		    pTop;
113cdf0e10cSrcweir 	elem *				pTail;
114cdf0e10cSrcweir };
115cdf0e10cSrcweir 
116cdf0e10cSrcweir template <class XX>
117cdf0e10cSrcweir class SweList_dyn
118cdf0e10cSrcweir {
119cdf0e10cSrcweir   public:
120cdf0e10cSrcweir 	// TYPES
121cdf0e10cSrcweir 	typedef SweList_dyn<XX>	   		self;
122cdf0e10cSrcweir 	typedef SweListElement< XX* >   elem;
123cdf0e10cSrcweir 	typedef SweListIterator< XX* > 	iterator;
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 	// LIFECYCLE
SweList_dyn()126cdf0e10cSrcweir 						SweList_dyn()		: pTop(0), pTail(0) {}
~SweList_dyn()127cdf0e10cSrcweir 						~SweList_dyn()		{ erase_all(); }
128cdf0e10cSrcweir 	// OPERATIONS
129cdf0e10cSrcweir 	void		   		push_front(
130cdf0e10cSrcweir 							XX *			i_pObj );
131cdf0e10cSrcweir 	void		   		push_back(
132cdf0e10cSrcweir 							XX *			i_pObj );
133cdf0e10cSrcweir 	void				pop_front();
134cdf0e10cSrcweir 	void				erase_all();
135cdf0e10cSrcweir 
136cdf0e10cSrcweir 	// INQUIRY
begin() const137cdf0e10cSrcweir 	iterator			begin() const       { return pTop; }
end() const138cdf0e10cSrcweir 	iterator			end() const         { return (elem*)0; }
front() const139cdf0e10cSrcweir 	XX * 				front()	const       { return pTop->Obj(); }
back() const140cdf0e10cSrcweir 	XX * 				back() const       	{ return pTail->Obj(); }
141cdf0e10cSrcweir 
empty() const142cdf0e10cSrcweir 	bool				empty() const       { return pTop == 0; }
143cdf0e10cSrcweir 	uintt				size() const;
144cdf0e10cSrcweir 
145cdf0e10cSrcweir   private:
146cdf0e10cSrcweir 	// Forbiddden methods.
147cdf0e10cSrcweir 						SweList_dyn(
148cdf0e10cSrcweir 							const self &		i_rList );
149cdf0e10cSrcweir 	self &				operator=(
150cdf0e10cSrcweir 							const self &		i_rList );
151cdf0e10cSrcweir 
152cdf0e10cSrcweir 	DYN elem *		    pTop;
153cdf0e10cSrcweir 	elem *				pTail;
154cdf0e10cSrcweir };
155cdf0e10cSrcweir 
156cdf0e10cSrcweir 
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 
159cdf0e10cSrcweir template<class XX>
160cdf0e10cSrcweir class SweListIterator
161cdf0e10cSrcweir {
162cdf0e10cSrcweir   public:
163cdf0e10cSrcweir 	typedef SweListIterator<XX> self;
164cdf0e10cSrcweir 	typedef SweListElement<XX>  elem;
165cdf0e10cSrcweir 
SweListIterator(elem * i_pElem=0)166cdf0e10cSrcweir 						SweListIterator(
167cdf0e10cSrcweir 							elem *      		i_pElem = 0)
168cdf0e10cSrcweir 												: 	pElem(i_pElem) { }
169cdf0e10cSrcweir 
170cdf0e10cSrcweir 	// OPERATORS
operator *() const171cdf0e10cSrcweir 	XX &				operator*() const		{ return pElem->Obj(); }
operator ++()172cdf0e10cSrcweir 	self &				operator++()			{ if (pElem != 0) pElem = pElem->Next();
173cdf0e10cSrcweir 												  return *this; }
operator ==(const self & i_rIter) const174cdf0e10cSrcweir 	bool				operator==(
175cdf0e10cSrcweir 							const self &		i_rIter	) const
176cdf0e10cSrcweir 												{ return pElem == i_rIter.pElem; }
operator !=(const self & i_rIter) const177cdf0e10cSrcweir 	bool				operator!=(
178cdf0e10cSrcweir 							const self &		i_rIter	) const
179cdf0e10cSrcweir 												{ return pElem != i_rIter.pElem; }
180cdf0e10cSrcweir   private:
181cdf0e10cSrcweir 	friend class SweListCIterator<XX>;
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 	elem *				pElem;
184cdf0e10cSrcweir };
185cdf0e10cSrcweir 
186cdf0e10cSrcweir template<class XX>
187cdf0e10cSrcweir class SweListCIterator
188cdf0e10cSrcweir {
189cdf0e10cSrcweir   public:
190cdf0e10cSrcweir 	typedef SweListCIterator<XX> self;
191cdf0e10cSrcweir 	typedef SweListElement<XX>  elem;
192cdf0e10cSrcweir 
SweListCIterator(const elem * i_pElem=0)193cdf0e10cSrcweir 						SweListCIterator(
194cdf0e10cSrcweir 							const elem * 		i_pElem = 0)
195cdf0e10cSrcweir 												:	pElem(i_pElem) { }
196cdf0e10cSrcweir 
197cdf0e10cSrcweir 	// OPERATORS
operator =(const SweListIterator<XX> & i_rIter)198cdf0e10cSrcweir 	self &				operator=(
199cdf0e10cSrcweir 							const SweListIterator<XX> &
200cdf0e10cSrcweir 												i_rIter )
201cdf0e10cSrcweir 												{ pElem = i_rIter.pElem; return *this; }
202cdf0e10cSrcweir 
operator *() const203cdf0e10cSrcweir 	const XX &			operator*() const		{ return pElem->Obj(); }
operator ++()204cdf0e10cSrcweir 	self &				operator++()			{ if (pElem != 0) pElem = pElem->Next();
205cdf0e10cSrcweir 												  return *this; }
operator ==(const self & i_rIter) const206cdf0e10cSrcweir 	bool				operator==(
207cdf0e10cSrcweir 							const self &		i_rIter	) const
208cdf0e10cSrcweir 												{ return pElem == i_rIter.pElem; }
operator !=(const self & i_rIter) const209cdf0e10cSrcweir 	bool				operator!=(
210cdf0e10cSrcweir 							const self &		i_rIter	) const
211cdf0e10cSrcweir 												{ return pElem != i_rIter.pElem; }
212cdf0e10cSrcweir   private:
213cdf0e10cSrcweir 	const elem *		pElem;
214cdf0e10cSrcweir };
215cdf0e10cSrcweir 
216cdf0e10cSrcweir // Implementierung
217cdf0e10cSrcweir 
218cdf0e10cSrcweir template <class XX>
219cdf0e10cSrcweir void
push_front(const XX & i_aObj)220cdf0e10cSrcweir SweList<XX>::push_front( const XX &	i_aObj )
221cdf0e10cSrcweir {
222cdf0e10cSrcweir 	DYN elem * dpNew = new elem(i_aObj);
223cdf0e10cSrcweir 	dpNew->SetNext(pTop);
224cdf0e10cSrcweir 	pTop = dpNew;
225cdf0e10cSrcweir 	if (pTail == 0)
226cdf0e10cSrcweir 		pTail = pTop;
227cdf0e10cSrcweir }
228cdf0e10cSrcweir 
229cdf0e10cSrcweir template <class XX>
230cdf0e10cSrcweir void
push_back(const XX & i_aObj)231cdf0e10cSrcweir SweList<XX>::push_back( const XX & i_aObj)
232cdf0e10cSrcweir {
233cdf0e10cSrcweir 	if (pTail != 0)
234cdf0e10cSrcweir 	{
235cdf0e10cSrcweir 		pTail->SetNext(new elem(i_aObj));
236cdf0e10cSrcweir 		pTail = pTail->Next();
237cdf0e10cSrcweir 	}
238cdf0e10cSrcweir 	else
239cdf0e10cSrcweir 	{
240cdf0e10cSrcweir 		pTop = pTail = new elem(i_aObj);
241cdf0e10cSrcweir 	}
242cdf0e10cSrcweir }
243cdf0e10cSrcweir 
244cdf0e10cSrcweir template <class XX>
245cdf0e10cSrcweir void
pop_front()246cdf0e10cSrcweir SweList<XX>::pop_front()
247cdf0e10cSrcweir {
248cdf0e10cSrcweir 	if (pTop != 0)
249cdf0e10cSrcweir 	{
250cdf0e10cSrcweir 		elem * pDel = pTop;
251cdf0e10cSrcweir 		pTop = pTop->Next();
252cdf0e10cSrcweir 		delete pDel;
253cdf0e10cSrcweir 		if (pTop == 0)
254cdf0e10cSrcweir 			pTail = 0;
255cdf0e10cSrcweir 	}
256cdf0e10cSrcweir }
257cdf0e10cSrcweir 
258cdf0e10cSrcweir template <class XX>
259cdf0e10cSrcweir uintt
size() const260cdf0e10cSrcweir SweList<XX>::size() const
261cdf0e10cSrcweir {
262cdf0e10cSrcweir 	uintt ret = 0;
263cdf0e10cSrcweir 	for ( const_iterator iter = begin();
264cdf0e10cSrcweir 		  iter != end();
265cdf0e10cSrcweir 		  ++iter )
266cdf0e10cSrcweir 	{
267cdf0e10cSrcweir 		++ret;
268cdf0e10cSrcweir 	}
269cdf0e10cSrcweir 	return ret;
270cdf0e10cSrcweir }
271cdf0e10cSrcweir 
272cdf0e10cSrcweir 
273cdf0e10cSrcweir template <class XX>
274cdf0e10cSrcweir void
erase_all()275cdf0e10cSrcweir SweList<XX>::erase_all()
276cdf0e10cSrcweir {
277cdf0e10cSrcweir 	for (pTail = pTop ; pTop != 0; pTail = pTop)
278cdf0e10cSrcweir 	{
279cdf0e10cSrcweir 		pTop = pTop->Next();
280cdf0e10cSrcweir 		delete pTail;
281cdf0e10cSrcweir 	}
282cdf0e10cSrcweir 	pTop = pTail = 0;
283cdf0e10cSrcweir }
284cdf0e10cSrcweir 
285cdf0e10cSrcweir 
286cdf0e10cSrcweir template <class XX>
287cdf0e10cSrcweir void
push_front(XX * i_pObj)288cdf0e10cSrcweir SweList_dyn<XX>::push_front( XX * i_pObj )
289cdf0e10cSrcweir {
290cdf0e10cSrcweir 	DYN elem * dpNew = new elem(i_pObj);
291cdf0e10cSrcweir 	dpNew->SetNext(pTop);
292cdf0e10cSrcweir 	pTop = dpNew;
293cdf0e10cSrcweir 	if (pTail == 0)
294cdf0e10cSrcweir 		pTail = pTop;
295cdf0e10cSrcweir }
296cdf0e10cSrcweir 
297cdf0e10cSrcweir template <class XX>
298cdf0e10cSrcweir void
push_back(XX * i_pObj)299cdf0e10cSrcweir SweList_dyn<XX>::push_back( XX * i_pObj )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir 	if (pTail != 0)
302cdf0e10cSrcweir 	{
303cdf0e10cSrcweir 		pTail->SetNext(new elem(i_pObj));
304cdf0e10cSrcweir 		pTail = pTail->Next();
305cdf0e10cSrcweir 	}
306cdf0e10cSrcweir 	else
307cdf0e10cSrcweir 	{
308cdf0e10cSrcweir 		pTop = pTail = new elem(i_pObj);
309cdf0e10cSrcweir 	}
310cdf0e10cSrcweir }
311cdf0e10cSrcweir 
312cdf0e10cSrcweir template <class XX>
313cdf0e10cSrcweir void
pop_front()314cdf0e10cSrcweir SweList_dyn<XX>::pop_front()
315cdf0e10cSrcweir {
316cdf0e10cSrcweir 	if (pTop != 0)
317cdf0e10cSrcweir 	{
318cdf0e10cSrcweir 		elem * pDel = pTop;
319cdf0e10cSrcweir 		pTop = pTop->Next();
320cdf0e10cSrcweir 		if (pDel->Obj() != 0)
321cdf0e10cSrcweir 			Delete_dyn(pDel->Obj());
322cdf0e10cSrcweir 		delete pDel;
323cdf0e10cSrcweir 		if (pTop == 0)
324cdf0e10cSrcweir 			pTail = 0;
325cdf0e10cSrcweir 	}
326cdf0e10cSrcweir }
327cdf0e10cSrcweir 
328cdf0e10cSrcweir 
329cdf0e10cSrcweir template <class XX>
330cdf0e10cSrcweir void
erase_all()331cdf0e10cSrcweir SweList_dyn<XX>::erase_all()
332cdf0e10cSrcweir {
333cdf0e10cSrcweir 	for (pTail = pTop ; pTop != 0; pTail = pTop)
334cdf0e10cSrcweir 	{
335cdf0e10cSrcweir 		pTop = pTop->Next();
336cdf0e10cSrcweir 		if (pTail->Obj() != 0)
337cdf0e10cSrcweir 		{
338cdf0e10cSrcweir             delete pTail->Obj();
339cdf0e10cSrcweir         }
340cdf0e10cSrcweir 		delete pTail;
341cdf0e10cSrcweir 	}
342cdf0e10cSrcweir 	pTop = pTail = 0;
343cdf0e10cSrcweir }
344cdf0e10cSrcweir 
345cdf0e10cSrcweir template <class XX>
346cdf0e10cSrcweir uintt
size() const347cdf0e10cSrcweir SweList_dyn<XX>::size() const
348cdf0e10cSrcweir {
349cdf0e10cSrcweir 	uintt ret = 0;
350cdf0e10cSrcweir 	for ( iterator iter = begin();
351cdf0e10cSrcweir 		  iter != end();
352cdf0e10cSrcweir 		  ++iter )
353cdf0e10cSrcweir 	{
354cdf0e10cSrcweir 		++ret;
355cdf0e10cSrcweir 	}
356cdf0e10cSrcweir 	return ret;
357cdf0e10cSrcweir }
358cdf0e10cSrcweir 
359cdf0e10cSrcweir 
360cdf0e10cSrcweir }   // namespace csv
361cdf0e10cSrcweir 
362cdf0e10cSrcweir 
363cdf0e10cSrcweir #endif
364cdf0e10cSrcweir 
365cdf0e10cSrcweir 
366