1//
2// VarIterator.cpp
3//
4// Library: Foundation
5// Package: Dynamic
6// Module: VarIterator
7//
8// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
9// and Contributors.
10//
11// SPDX-License-Identifier: BSL-1.0
12//
13
14
15#include "Poco/Dynamic/VarIterator.h"
16#include "Poco/Dynamic/Var.h"
17#include "Poco/Dynamic/Struct.h"
18#undef min
19#undef max
20#include <limits>
21
22
23namespace Poco {
24namespace Dynamic {
25
26
27const std::size_t VarIterator::POSITION_END = std::numeric_limits<std::size_t>::max();
28
29
30VarIterator::VarIterator(Var* pVar, bool positionEnd):
31 _pVar(pVar),
32 _position(positionEnd ? POSITION_END : 0)
33{
34}
35
36
37VarIterator::VarIterator(const VarIterator& other):
38 _pVar(other._pVar),
39 _position(other._position)
40{
41}
42
43
44VarIterator::~VarIterator()
45{
46}
47
48
49VarIterator& VarIterator::operator = (const VarIterator& other)
50{
51 VarIterator tmp(other);
52 swap(tmp);
53 return *this;
54}
55
56
57void VarIterator::swap(VarIterator& other)
58{
59 using std::swap;
60
61 swap(_pVar, other._pVar);
62 swap(_position, other._position);
63}
64
65
66void VarIterator::increment() const
67{
68 if (POSITION_END == _position)
69 throw RangeException("End of iterator reached.");
70
71 if (_position < _pVar->size() - 1)
72 ++_position;
73 else
74 _position = POSITION_END;
75}
76
77
78void VarIterator::decrement() const
79{
80 if (0 == _position)
81 throw RangeException("Beginning of iterator reached.");
82 else if (POSITION_END == _position)
83 _position = _pVar->size() - 1;
84 else
85 --_position;
86}
87
88
89void VarIterator::setPosition(std::size_t pos) const
90{
91 if (_position == pos) return;
92
93 if (pos < _pVar->size())
94 _position = pos;
95 else if (pos == _pVar->size())
96 _position = POSITION_END;
97 else
98 throw RangeException("Invalid position argument.");
99}
100
101
102Var& VarIterator::operator * () const
103{
104 if (POSITION_END == _position)
105 throw InvalidAccessException("End of iterator reached.");
106
107 return _pVar->operator[](_position);
108}
109
110
111Var* VarIterator::operator -> () const
112{
113 if (POSITION_END == _position)
114 throw InvalidAccessException("End of iterator reached.");
115
116 return &_pVar->operator[](_position);
117}
118
119
120const VarIterator& VarIterator::operator ++ () const
121{
122 increment();
123 return *this;
124}
125
126
127VarIterator VarIterator::operator ++ (int) const
128{
129 VarIterator old(*this);
130 increment();
131 return old;
132}
133
134
135const VarIterator& VarIterator::operator -- () const
136{
137 decrement();
138 return *this;
139}
140
141
142VarIterator VarIterator::operator -- (int) const
143{
144 VarIterator old(*this);
145 decrement();
146 return old;
147}
148
149
150VarIterator VarIterator::operator + (std::size_t diff) const
151{
152 VarIterator ri(*this);
153 ri.setPosition(_position + diff);
154 return ri;
155}
156
157
158VarIterator VarIterator::operator - (std::size_t diff) const
159{
160 if (diff > _position) throw RangeException("Invalid position argument.");
161 VarIterator ri(*this);
162 ri.setPosition(_position - diff);
163 return ri;
164}
165
166
167} } // namespace Poco::Dynamic
168