ORIGINAL
Loading...
Searching...
No Matches
randomAccessIterator.h
1#ifndef RANDOMACCESSITERATOR_H
2#define RANDOMACCESSITERATOR_H
3
4#include "container.h"
5#include "error.h"
6#include "iterator.h"
7#include <limits>
8
9namespace original{
10 template<typename TYPE>
11 class randomAccessIterator : public baseIterator<TYPE>{
12 protected:
13 mutable TYPE* _ptr;
14 mutable const container<TYPE>* _container;
15 mutable int64_t _pos;
16
17 explicit randomAccessIterator(TYPE* ptr, const container<TYPE>* container, int64_t pos);
18 bool equalPtr(const iterator<TYPE> * other) const override;
19 public:
20 randomAccessIterator(const randomAccessIterator& other);
21 randomAccessIterator& operator=(const randomAccessIterator& other);
22 randomAccessIterator* clone() const override;
23 [[nodiscard]] bool hasNext() const override;
24 [[nodiscard]] bool hasPrev() const override;
25 bool atPrev(const iterator<TYPE>* other) const override;
26 bool atNext(const iterator<TYPE>* other) const override;
27 void next() const override;
28 void prev() const override;
29 void operator+=(int64_t steps) const override;
30 void operator-=(int64_t steps) const override;
31 int64_t operator-(const iterator<TYPE>& other) const override;
32 randomAccessIterator* getNext() const override;
33 randomAccessIterator* getPrev() const override;
34 TYPE& get() override;
35 TYPE get() const override;
36 void set(const TYPE& data) override;
37 [[nodiscard]] bool isValid() const override;
38 [[nodiscard]] std::string className() const override;
39 };
40}
41
42 template<typename TYPE>
43 original::randomAccessIterator<TYPE>::randomAccessIterator(TYPE* ptr, const container<TYPE>* container,
44 const int64_t pos)
45 : _ptr{ptr}, _container{container}, _pos(pos) {}
46
47 template<typename TYPE>
48 auto original::randomAccessIterator<TYPE>::equalPtr(const iterator<TYPE> *other) const -> bool {
49 auto* other_it = dynamic_cast<const randomAccessIterator*>(other);
50 return other_it != nullptr && _ptr == other_it->_ptr;
51 }
52
53 template<typename TYPE>
54 original::randomAccessIterator<TYPE>::randomAccessIterator(const randomAccessIterator &other) : _pos(0) {
55 this->operator=(other);
56 }
57
58 template<typename TYPE>
59 auto original::randomAccessIterator<TYPE>::operator=(
61 if (this == &other) {
62 return *this;
63 }
64 this->_ptr = other._ptr;
65 this->_container = other._container;
66 this->_pos = other._pos;
67 return *this;
68 }
69
70 template<typename TYPE>
71 auto original::randomAccessIterator<TYPE>::clone() const -> randomAccessIterator* {
72 return new randomAccessIterator{_ptr, _container, _pos};
73 }
74
75 template<typename TYPE>
76 auto original::randomAccessIterator<TYPE>::hasNext() const -> bool {
77 return this->isValid() && this->_pos <= this->_container->size() - 1;
78 }
79
80 template<typename TYPE>
81 auto original::randomAccessIterator<TYPE>::hasPrev() const -> bool {
82 return this->isValid() && this->_pos >= 1;
83 }
84
85 template<typename TYPE>
86 auto original::randomAccessIterator<TYPE>::atPrev(const iterator<TYPE> *other) const -> bool {
88 }
89
90 template<typename TYPE>
91 auto original::randomAccessIterator<TYPE>::atNext(const iterator<TYPE> *other) const -> bool {
93 }
94
95 template<typename TYPE>
96 auto original::randomAccessIterator<TYPE>::next() const -> void {
97 ++this->_pos;
98 ++this->_ptr;
99 }
100
101 template<typename TYPE>
102 auto original::randomAccessIterator<TYPE>::prev() const -> void {
103 --this->_pos;
104 --this->_ptr;
105 }
106
107 template<typename TYPE>
108 auto original::randomAccessIterator<TYPE>::operator+=(int64_t steps) const -> void {
109 this->_pos += steps;
110 this->_ptr += steps;
111 }
112
113 template<typename TYPE>
114 auto original::randomAccessIterator<TYPE>::operator-=(int64_t steps) const -> void {
115 this->_pos -= steps;
116 this->_ptr -= steps;
117 }
118
119 template <typename TYPE>
120 auto original::randomAccessIterator<TYPE>::operator-(const iterator<TYPE>& other) const -> int64_t
121 {
122 auto* other_it = dynamic_cast<const randomAccessIterator*>(&other);
123 if (other_it == nullptr)
124 return this > &other ?
125 std::numeric_limits<int64_t>::max() :
126 std::numeric_limits<int64_t>::min();
127 if (this->_container != other_it->_container)
128 return this->_container > other_it->_container ?
129 std::numeric_limits<int64_t>::max() :
130 std::numeric_limits<int64_t>::min();
131 return this->_ptr - other_it->_ptr;
132 }
133
134 template<typename TYPE>
135 auto original::randomAccessIterator<TYPE>::getNext() const -> randomAccessIterator* {
136 if (!this->isValid()) throw outOfBoundError();
137 auto it = this->clone();
138 it->next();
139 return it;
140 }
141
142 template<typename TYPE>
143 auto original::randomAccessIterator<TYPE>::getPrev() const -> randomAccessIterator* {
144 if (!this->isValid()) throw outOfBoundError();
145 auto it = this->clone();
146 it->prev();
147 return it;
148 }
149
150 template<typename TYPE>
151 auto original::randomAccessIterator<TYPE>::get() -> TYPE& {
152 if (!this->isValid()) throw outOfBoundError();
153 return *this->_ptr;
154 }
155
156 template<typename TYPE>
157 auto original::randomAccessIterator<TYPE>::set(const TYPE& data) -> void {
158 if (!this->isValid()) throw outOfBoundError();
159 *this->_ptr = data;
160 }
161
162 template<typename TYPE>
163 auto original::randomAccessIterator<TYPE>::get() const -> TYPE
164 {
165 if (!this->isValid()) throw outOfBoundError();
166 return *this->_ptr;
167 }
168
169 template<typename TYPE>
170 auto original::randomAccessIterator<TYPE>::isValid() const -> bool {
171 return this->_pos >= 0 && this->_pos < this->_container->size();
172 }
173
174 template<typename TYPE>
175 auto original::randomAccessIterator<TYPE>::className() const -> std::string {
176 return "RandomAccessIterator";
177 }
178
179#endif //RANDOMACCESSITERATOR_H
Definition iterator.h:56
Definition container.h:10
Definition iterator.h:11
Definition error.h:12
Definition randomAccessIterator.h:11