Subversion Repositories spk

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 cycrow 1
#ifndef EXT_SIMPLE_LIST_INCLUDED
2
#define EXT_SIMPLE_LIST_INCLUDED
3
namespace ext
4
{
5
 
6
template <class Ty>
7
class simple_list
8
{
9
	public:
10
		typedef Ty value_type;
11
		typedef Ty& reference;
12
		typedef const Ty& const_reference;
13
		typedef size_t size_type;
14
 
15
	private:
16
		struct node
17
		{
18
			node *next;
19
			value_type val;
20
		};
21
 
22
		node *m_head;
23
		node *m_last;
24
		size_type m_size;
25
 
26
	public:
27
		class const_iterator
28
		{
29
			protected:
30
				node *m_node;
31
 
32
			public:
33
				const_iterator() { }
34
				const_iterator(node *n) { m_node=n; }
35
				const_iterator& operator ++() { m_node=m_node->next; return *this; }
36
				const_iterator operator ++(int) { node *old=m_node; m_node=m_node->next; return const_iterator(old); }
37
 
38
				const_reference operator *() const { return m_node->val; }
39
				const_reference operator ->() const { return m_node->val; }
40
 
41
				bool operator ==(const_iterator& right) const { return m_node==right.m_node; }
42
				bool operator !=(const_iterator& right) const { return m_node!=right.m_node; }
43
		};
44
 
45
		class iterator : public const_iterator
46
		{
47
			public:
48
				iterator() { }
49
				iterator(node *n) : const_iterator(n) { }
50
 
51
				iterator& operator ++() { m_node=m_node->next; return *this; }
52
				iterator operator ++(int) { node *old=m_node; m_node=m_node->next; return iterator(old); }
53
 
54
				reference operator *() { return m_node->val; }
55
				reference operator ->() { return m_node->val; }
56
		};
57
 
58
	public:
59
		simple_list() { m_head=new node(); m_head->next=m_head; clear(); }
60
		simple_list(const simple_list& other)
61
		{
62
			m_head=new node(); m_head->next=m_head; clear();
63
			for(const_iterator &it=other.begin(); it!=other.end(); ++it){
64
				push_back(*it);
65
			}
66
		}
67
 
68
		~simple_list() { clear(); delete m_head; }
69
 
70
		void clear()
71
		{
72
			node *n, *old;
73
			for(old=0, n=m_head->next; n!=m_head; old=n, n=n->next){
74
				delete old;
75
			}
76
			delete old;
77
 
78
			m_head->next=m_head;
79
			m_last=m_head;
80
			m_size=0;
81
		}
82
 
83
		iterator begin() { return iterator(m_head->next); }
84
		iterator end() { return iterator(m_head); }
85
 
86
		const_iterator begin() const { return const_iterator(m_head->next); }
87
		const_iterator end() const { return const_iterator(m_head); }
88
 
89
		size_type size() const { return m_size; }
90
 
91
		iterator push_back(const_reference val)
92
		{
93
			node *n=new node();
94
			n->val=val;
95
			m_last->next=n;
96
			n->next=m_head;
97
			m_last=n;
98
			m_size++;
99
			return iterator(n);
100
		}
101
 
102
		reference front() { return *begin(); }
103
		reference back() { return m_last->val; }
104
 
105
		const_reference front() const { return *begin(); }
106
		const_reference back() const { return m_last->val; }
107
};
108
 
109
};
110
 
111
#endif // !defined(EXT_SIMPLE_LIST_INCLUDED)