-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdllist_iterator.h
147 lines (123 loc) · 5.62 KB
/
dllist_iterator.h
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#ifndef EASY_ALGORITHM_DLLIST_ITERATOR_H
#define EASY_ALGORITHM_DLLIST_ITERATOR_H
#include <iosfwd>
#include <stdexcept>
#include "iterator.h"
#include "dllist.h"
namespace easy_algorithm {
template <class Item>
class DLListIterator : public Iterator<Item> { // Класс - итератор для массивов
public:
typedef typename DLList<Item>::dllink dllink;
DLListIterator(const Iterator<Item>& iter); // Конструктор копирования. Создает итератор идентичный iter
DLListIterator(dllink item); // Конструктор с параметром, на какой элемент указывать
virtual ~DLListIterator(); // Виртуальный деструктор позволяет полиморфное удаление объектов
DLListIterator(); // Конструктор по умолчанию
dllink getNode() const;
void setNode(dllink node);
private:
virtual std::ostream& vPrint(std::ostream& os, const Iterator<Item>& iter) const; // Вывод значения элемента в поток
virtual std::istream& vInput(std::istream& is, Iterator<Item>& ds); // Ввод значения элемента из потока
virtual Iterator<Item>& vIncrease(); // Соответствует operator ++
virtual Iterator<Item>& vDecrease(); // Соответствует operator --
virtual const Iterator<Item>& vSeekIter(ptrdiff_t diff); // Соответствует operator +=, operator -=
virtual const Iterator<Item>& vAssign(const Iterator<Item>& iter); // Соответствует = iter
virtual Iterator<Item>& vInsert(const Item& item); // Соответствует = item
virtual void vSwap(Iterator<Item>& iter); // Соответствует swap
virtual ptrdiff_t vDiff(const Iterator<Item>& iter); // Соответствует operator -
protected:
using Iterator<Item>::_pItem; // Указатель на элемент, на который ссылается итератор
dllink _pNode;
};
template <class Item>
DLListIterator<Item>::DLListIterator() : Iterator<Item>(), _pNode(0) {}
template <class Item>
DLListIterator<Item>::~DLListIterator() {}
template <class Item>
DLListIterator<Item>::DLListIterator(dllink item) : Iterator<Item>(), _pNode(item) {
_pItem = &(item->item);
}
template <class Item>
DLListIterator<Item>::DLListIterator(const Iterator<Item>& iter) : Iterator<Item>(iter), _pNode(dynamic_cast<const DLListIterator<Item>*>(&iter)->getNode()) {}
template <class Item>
std::ostream& DLListIterator<Item>::vPrint(std::ostream& os, const Iterator<Item>& iter) const {
os << *iter; // Вывод элемента, на который указывает итератор
return os;
}
template <class Item>
typename DLList<Item>::dllink DLListIterator<Item>::getNode() const {
return _pNode;
}
template <class Item>
void DLListIterator<Item>::setNode(dllink node) {
_pNode = node;
}
template <class Item>
std::istream& DLListIterator<Item>::vInput(std::istream& is, Iterator<Item>& iter) {
Item temp;
is >> temp;
if (!(is.rdstate() & std::ios::failbit))
iter = temp; // Присваивание элементу, на который указывает итератор, значения из входного потока
return is;
}
template <class Item>
Iterator<Item>& DLListIterator<Item>::vIncrease() {
_pNode = _pNode->next;
_pItem = &(_pNode->item);
//++_pItem;
return *this;
}
template <class Item>
Iterator<Item>& DLListIterator<Item>::vDecrease() {
_pNode = _pNode->prev;
_pItem = &(_pNode->item);
//--_pItem;
return *this;
}
template <class Item>
const Iterator<Item>& DLListIterator<Item>::vSeekIter(ptrdiff_t diff) {
if (diff > 0)
for (ptrdiff_t i = 0; i < diff; ++i)
_pNode = _pNode->next;
if (diff < 0)
for (ptrdiff_t i = 0; i < -diff; ++i)
_pNode = _pNode->prev;
_pItem = &(_pNode->item);
//_pItem += diff;
return *this;
}
template <class Item>
const Iterator<Item>& DLListIterator<Item>::vAssign(const Iterator<Item>& iter) {
const DLListIterator<Item>* pIter = dynamic_cast<const DLListIterator<Item>*>(&iter);
_pNode = pIter->getNode();
_pItem = pIter->getPointer();
return *this;
}
template <class Item>
Iterator<Item>& DLListIterator<Item>::vInsert(const Item& item) {
*_pItem = item;
return *this;
}
template <class Item>
void DLListIterator<Item>::vSwap(Iterator<Item>& iter) {
Item* temp = _pItem;
_pItem = iter.getPointer();
iter.setPointer(temp);
DLListIterator<Item>* pIter = dynamic_cast<DLListIterator<Item>*>(&iter);
dllink ltemp = _pNode;
_pNode = pIter->getNode();
pIter->setNode(ltemp);
}
template <class Item>
ptrdiff_t DLListIterator<Item>::vDiff(const Iterator<Item>& iter) {
ptrdiff_t cnt = 0;
dllink first = dynamic_cast<const DLListIterator<Item>*>(&iter)->getNode();
if (first != _pNode)
while (first != _pNode) {
first = first->next;
++cnt;
}
return cnt;
}
}
#endif