-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathlist_pool_iterator.h
More file actions
74 lines (58 loc) · 1.69 KB
/
list_pool_iterator.h
File metadata and controls
74 lines (58 loc) · 1.69 KB
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
struct iterator {
typedef typename list_pool::value_type value_type;
typedef typename list_pool::list_type difference_type;
typedef typename std::forward_iterator_tag iterator_category;
typedef value_type& reference;
typedef value_type* pointer;
list_pool* pool;
typename list_pool::list_type node;
iterator() {} // creates a partially formed value
iterator(list_pool& p, list_pool::list_type node) :
pool(&p), node(node) {}
iterator(list_pool& p) : pool(&p), node(p.end()) {}
reference operator*() const {
return pool->value(node);
}
pointer operator->() const {
return &**this;
}
iterator& operator++() {
node = pool->next(node);
return *this;
}
iterator operator++(int) {
iterator tmp(*this);
++*this;
return tmp;
}
friend
bool operator==(const iterator& x, const iterator& y) {
// assert(x.pool == y.pool);
return x.node == y.node;
}
friend
bool operator!=(const iterator& x, const iterator& y) {
return !(x == y);
}
// extends the interface to Linked Iterator:
friend
void set_successor(iterator x, iterator y) {
// assert(x.p == y.p)
x.pool->next(x.node) = y.node;
}
// extend the interface to Singly Linked List Iterator:
// (this concept and these methods are not discussed in the course.)
friend
void push_front(iterator& x, const T& value) {
x.node = x.pool->allocate(value, x.node);
}
friend
void push_back(iterator& x, const T& value) {
typename list_pool::list_type tmp = x.pool->allocate(value, x.pool->next(x.node));
x.pool->next(x.node) = tmp;
}
friend
void free(iterator& x) {
x.pool->free(x.node);
}
};