aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/poco/Foundation/src/VarIterator.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/poco/Foundation/src/VarIterator.cpp
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/poco/Foundation/src/VarIterator.cpp')
-rw-r--r--contrib/libs/poco/Foundation/src/VarIterator.cpp167
1 files changed, 167 insertions, 0 deletions
diff --git a/contrib/libs/poco/Foundation/src/VarIterator.cpp b/contrib/libs/poco/Foundation/src/VarIterator.cpp
new file mode 100644
index 0000000000..d816c23c4a
--- /dev/null
+++ b/contrib/libs/poco/Foundation/src/VarIterator.cpp
@@ -0,0 +1,167 @@
+//
+// VarIterator.cpp
+//
+// Library: Foundation
+// Package: Dynamic
+// Module: VarIterator
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Dynamic/VarIterator.h"
+#include "Poco/Dynamic/Var.h"
+#include "Poco/Dynamic/Struct.h"
+#undef min
+#undef max
+#include <limits>
+
+
+namespace Poco {
+namespace Dynamic {
+
+
+const std::size_t VarIterator::POSITION_END = std::numeric_limits<std::size_t>::max();
+
+
+VarIterator::VarIterator(Var* pVar, bool positionEnd):
+ _pVar(pVar),
+ _position(positionEnd ? POSITION_END : 0)
+{
+}
+
+
+VarIterator::VarIterator(const VarIterator& other):
+ _pVar(other._pVar),
+ _position(other._position)
+{
+}
+
+
+VarIterator::~VarIterator()
+{
+}
+
+
+VarIterator& VarIterator::operator = (const VarIterator& other)
+{
+ VarIterator tmp(other);
+ swap(tmp);
+ return *this;
+}
+
+
+void VarIterator::swap(VarIterator& other)
+{
+ using std::swap;
+
+ swap(_pVar, other._pVar);
+ swap(_position, other._position);
+}
+
+
+void VarIterator::increment() const
+{
+ if (POSITION_END == _position)
+ throw RangeException("End of iterator reached.");
+
+ if (_position < _pVar->size() - 1)
+ ++_position;
+ else
+ _position = POSITION_END;
+}
+
+
+void VarIterator::decrement() const
+{
+ if (0 == _position)
+ throw RangeException("Beginning of iterator reached.");
+ else if (POSITION_END == _position)
+ _position = _pVar->size() - 1;
+ else
+ --_position;
+}
+
+
+void VarIterator::setPosition(std::size_t pos) const
+{
+ if (_position == pos) return;
+
+ if (pos < _pVar->size())
+ _position = pos;
+ else if (pos == _pVar->size())
+ _position = POSITION_END;
+ else
+ throw RangeException("Invalid position argument.");
+}
+
+
+Var& VarIterator::operator * () const
+{
+ if (POSITION_END == _position)
+ throw InvalidAccessException("End of iterator reached.");
+
+ return _pVar->operator[](_position);
+}
+
+
+Var* VarIterator::operator -> () const
+{
+ if (POSITION_END == _position)
+ throw InvalidAccessException("End of iterator reached.");
+
+ return &_pVar->operator[](_position);
+}
+
+
+const VarIterator& VarIterator::operator ++ () const
+{
+ increment();
+ return *this;
+}
+
+
+VarIterator VarIterator::operator ++ (int) const
+{
+ VarIterator old(*this);
+ increment();
+ return old;
+}
+
+
+const VarIterator& VarIterator::operator -- () const
+{
+ decrement();
+ return *this;
+}
+
+
+VarIterator VarIterator::operator -- (int) const
+{
+ VarIterator old(*this);
+ decrement();
+ return old;
+}
+
+
+VarIterator VarIterator::operator + (std::size_t diff) const
+{
+ VarIterator ri(*this);
+ ri.setPosition(_position + diff);
+ return ri;
+}
+
+
+VarIterator VarIterator::operator - (std::size_t diff) const
+{
+ if (diff > _position) throw RangeException("Invalid position argument.");
+ VarIterator ri(*this);
+ ri.setPosition(_position - diff);
+ return ri;
+}
+
+
+} } // namespace Poco::Dynamic