File: tSaveList.h

package info (click to toggle)
fact%2B%2B 1.6.5~dfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 4,496 kB
  • sloc: cpp: 28,000; java: 22,674; xml: 3,268; makefile: 102; ansic: 61; sh: 3
file content (123 lines) | stat: -rw-r--r-- 3,164 bytes parent folder | download | duplicates (3)
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
/* This file is part of the FaCT++ DL reasoner
Copyright (C) 2003-2015 Dmitry Tsarkov and The University of Manchester
Copyright (C) 2015-2016 Dmitry Tsarkov

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*/

#ifndef TSAVELIST_H
#define TSAVELIST_H

/**
 *	template list for Saving/Restoring internal state (saving class is template parameter).
 *  template class should define empty/copy c'tors, member function level()
 */
template <class T>
class TSaveList
{
protected:	// internal types
		/// type of the list element
	class List : public T
	{
	private:	// no copy
			/// copy c'tor (unimplemented)
		List ( const List& );
			/// assignment (unimplemented)
		List& operator = ( const List& );

	public:		// members
			/// pointer to next element
		List* next;

	public:		// interface
			/// empty c'tor
		List ( List* n = NULL ) : next(n) {}
			/// create object from given one and from given next
		List ( const T& obj, List* n ) : T(obj), next(n) {}
			/// d'tor: do nothing
		~List ( void ) {}

			/// clone given sub-list
		List* clone ( void ) { return new List ( *this, next ? next->clone() : NULL ); }
			/// clear sub-list
		void clear ( void )
		{
			if ( next )
			{
				next->clear();
				delete next;
			}
		}
	}; // List

protected:	// members
		/// pointer to head of list
	List* head;

public:		// interface
		/// empty c'tor
	TSaveList ( void ) : head(NULL) {}
		/// copy c'tor
	TSaveList ( const TSaveList& copy ) : head ( copy.head ? copy.head->clone() : NULL ) {}
		/// d'tor -- clear stack
	~TSaveList ( void ) { clear(); }

	// stack operations

		/// check that stack is empty
	bool empty ( void ) const { return (head == NULL); }
		/// put empty element to stack; @return pointer to it
	T* push ( void ) { head = new List ( head ); return head; }
		/// put given element to stack; @return pointer to it
	T* push ( const T& el ) { head = new List ( el, head ); return head; }
		/// get top element from stack
	T* pop ( void )
	{
		T* ret = head;
		if ( !empty() )
			head = head->next;
		return ret;
	}
		/// get element from stack with given level
	T* pop ( unsigned int level )
	{
		List* p = head;
		while ( p && p->level() > level )
		{
			head = p->next;
			delete p;
			p = head;
		}
		// here p==head and either both == NULL or points to proper element
		if ( p )
			head = head->next;
		return p;
	}

	// extra operations

		/// clear the stack
	void clear ( void )
	{
		if ( !empty() )
		{
			head->clear();
			delete head;
			head = NULL;
		}
	}
}; // TSaveList

#endif