rogue
Loading...
Searching...
No Matches
FrameIterator.cpp
Go to the documentation of this file.
1
18
21
23
24ris::FrameIterator::FrameIterator(ris::FramePtr frame, bool write, bool end) {
25 write_ = write;
26 frame_ = frame;
27 frameSize_ = (write_) ? frame_->getSize() : frame_->getPayload();
28
29 // end iterator
30 if (end) {
31 buff_ = frame_->endBuffer();
32 framePos_ = frameSize_;
33 buffBeg_ = frameSize_;
34 buffEnd_ = frameSize_;
35 data_ = NULL;
36 } else {
37 buff_ = frame_->beginBuffer();
38 framePos_ = 0;
39 buffBeg_ = 0;
40 buffEnd_ = (write_) ? (*buff_)->getSize() : (*buff_)->getPayload();
41 data_ = (*buff_)->begin();
42 }
43}
44
46void ris::FrameIterator::increment(int32_t diff) {
47 framePos_ += diff;
48 data_ += diff;
49
50 // Past end of buffer
51 if (framePos_ >= buffEnd_) {
52 // Past end of frame
53 if (framePos_ >= frameSize_) {
54 framePos_ = frameSize_;
55 buffBeg_ = frameSize_;
56 buffEnd_ = frameSize_;
57 buff_ = frame_->endBuffer();
58 data_ = NULL;
59
60 // Move forward in buffer chain
61 } else {
62 // Increment current buffer until we find the location of the data position
63 // Iterator always contains one extra buffer index
64 while (framePos_ >= buffEnd_) {
65 buff_++;
66 buffBeg_ = buffEnd_;
67 buffEnd_ += (write_) ? (*buff_)->getSize() : (*buff_)->getPayload();
68 }
69
70 // Set pointer
71 data_ = (*buff_)->begin() + (framePos_ - buffBeg_);
72 }
73 }
74}
75
77void ris::FrameIterator::decrement(int32_t diff) {
78 framePos_ += diff;
79 data_ += diff;
80
81 // Before start of buffer
82 if (framePos_ < buffBeg_) {
83 // Before beginning of frame
84 if (framePos_ < 0) {
85 framePos_ = frameSize_;
86 buffBeg_ = frameSize_;
87 buffEnd_ = frameSize_;
88 buff_ = frame_->endBuffer();
89 data_ = NULL;
90
91 // Move backwards in buffer chain
92 } else {
93 // Decrement current buffer until the desired frame position is greater than
94 // the bottom of the buffer
95 while (framePos_ < buffBeg_) {
96 buff_--;
97 buffEnd_ = buffBeg_;
98 buffBeg_ -= (write_) ? (*buff_)->getSize() : (*buff_)->getPayload();
99 }
100
101 // Set pointer
102 data_ = (*buff_)->begin() + (framePos_ - buffBeg_);
103 }
104 }
105}
106
107ris::FrameIterator::FrameIterator() {
108 write_ = false;
109 framePos_ = 0;
110 frameSize_ = 0;
111 buffBeg_ = 0;
112 buffEnd_ = 0;
113 data_ = NULL;
114}
115
117const ris::FrameIterator ris::FrameIterator::operator=(const ris::FrameIterator& rhs) {
118 this->write_ = rhs.write_;
119 this->frame_ = rhs.frame_;
120 this->framePos_ = rhs.framePos_;
121 this->frameSize_ = rhs.frameSize_;
122 this->buff_ = rhs.buff_;
123 this->buffBeg_ = rhs.buffBeg_;
124 this->buffEnd_ = rhs.buffEnd_;
125 this->data_ = rhs.data_;
126 return *this;
127}
128
130ris::FrameIterator ris::FrameIterator::endBuffer() {
131 ris::FrameIterator ret(*this);
132 ret.increment(buffEnd_ - framePos_);
133 return ret;
134}
135
137uint32_t ris::FrameIterator::remBuffer() {
138 return (buffEnd_ - framePos_);
139}
140
142uint8_t& ris::FrameIterator::operator*() const {
143 return *data_;
144}
145
147// uint8_t * ris::FrameIterator::operator ->() const {
148// return data_;
149//}
150
152uint8_t* ris::FrameIterator::ptr() const {
153 return data_;
154}
155
157uint8_t ris::FrameIterator::operator[](const uint32_t offset) const {
158 ris::FrameIterator ret(*this);
159 ret.increment(static_cast<int32_t>(offset));
160 return *ret;
161}
162
164const ris::FrameIterator& ris::FrameIterator::operator++() {
165 this->increment(1);
166 return *this;
167}
168
170ris::FrameIterator ris::FrameIterator::operator++(int) {
171 ris::FrameIterator ret(*this);
172 this->increment(1);
173 return ret;
174}
175
177const ris::FrameIterator& ris::FrameIterator::operator--() {
178 this->decrement(-1);
179 return *this;
180}
181
183ris::FrameIterator ris::FrameIterator::operator--(int) {
184 ris::FrameIterator ret(*this);
185 this->decrement(-1);
186 return ret;
187}
188
190bool ris::FrameIterator::operator!=(const ris::FrameIterator& other) const {
191 return (this->framePos_ != other.framePos_);
192}
193
195bool ris::FrameIterator::operator==(const ris::FrameIterator& other) const {
196 return (this->framePos_ == other.framePos_);
197}
198
200bool ris::FrameIterator::operator<(const ris::FrameIterator& other) const {
201 return (this->framePos_ < other.framePos_);
202}
203
205bool ris::FrameIterator::operator>(const ris::FrameIterator& other) const {
206 return (this->framePos_ > other.framePos_);
207}
208
210bool ris::FrameIterator::operator<=(const ris::FrameIterator& other) const {
211 return (this->framePos_ <= other.framePos_);
212}
213
215bool ris::FrameIterator::operator>=(const ris::FrameIterator& other) const {
216 return (this->framePos_ >= other.framePos_);
217}
218
220ris::FrameIterator ris::FrameIterator::operator+(const int32_t add) const {
221 ris::FrameIterator ret(*this);
222 if (add > 0)
223 ret.increment(add);
224 else
225 ret.decrement(add);
226 return ret;
227}
228
230ris::FrameIterator ris::FrameIterator::operator-(const int32_t sub) const {
231 ris::FrameIterator ret(*this);
232 if (sub > 0)
233 ret.decrement(-1 * sub);
234 else
235 ret.increment(-1 * sub);
236 return ret;
237}
238
240int32_t ris::FrameIterator::operator-(const ris::FrameIterator& other) const {
241 return (this->framePos_ - other.framePos_);
242}
243
245ris::FrameIterator& ris::FrameIterator::operator+=(const int32_t add) {
246 if (add > 0)
247 this->increment(add);
248 else
249 this->decrement(add);
250 return *this;
251}
252
254ris::FrameIterator& ris::FrameIterator::operator-=(const int32_t sub) {
255 if (sub > 0)
256 this->decrement(-1 * sub);
257 else
258 this->increment(-1 * sub);
259 return *this;
260}
Random-access byte iterator across a Frame payload.
std::shared_ptr< rogue::interfaces::stream::Frame > FramePtr
Shared pointer alias for Frame.
Definition Frame.h:549