summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2008-03-26 14:01:38 +0000
committerAlan Conway <aconway@apache.org>2008-03-26 14:01:38 +0000
commit3813b8fab06266dae0f67ef1db09917cefebfbf0 (patch)
treed58072668d8a670bbb698168637c7c96c47d1669 /cpp/src
parenta8e05c3647e6ee7c17a9cd31777fe15ba8374f5b (diff)
downloadqpid-python-3813b8fab06266dae0f67ef1db09917cefebfbf0.tar.gz
Bounds-checking iterator wrapper, for use with Codec::encode/decode.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@641315 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Makefile.am1
-rw-r--r--cpp/src/qpid/BoundedIterator.h67
-rw-r--r--cpp/src/tests/BoundedIterator.cpp74
-rw-r--r--cpp/src/tests/Makefile.am2
4 files changed, 143 insertions, 1 deletions
diff --git a/cpp/src/Makefile.am b/cpp/src/Makefile.am
index fce2788662..d40bbf699e 100644
--- a/cpp/src/Makefile.am
+++ b/cpp/src/Makefile.am
@@ -145,6 +145,7 @@ libqpidcommon_la_SOURCES = \
qpid/framing/MaxMethodBodySize.h \
qpid/framing/TransferContent.cpp \
qpid/assert.cpp qpid/assert.h \
+ qpid/BoundedIterator.h \
qpid/Exception.cpp \
qpid/Plugin.cpp \
qpid/Url.cpp \
diff --git a/cpp/src/qpid/BoundedIterator.h b/cpp/src/qpid/BoundedIterator.h
new file mode 100644
index 0000000000..1ff0f01ede
--- /dev/null
+++ b/cpp/src/qpid/BoundedIterator.h
@@ -0,0 +1,67 @@
+#ifndef QPID_BOUNDEDITERATOR_H
+#define QPID_BOUNDEDITERATOR_H
+
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#include <boost/iterator/iterator_adaptor.hpp>
+#include "qpid/Exception.h"
+
+namespace qpid {
+
+struct OutOfBoundsException : public Exception {};
+
+
+/**
+ * Iterator wrapper that throws an exception if iterated beyound the bounds.
+ */
+template <class Iter>
+class BoundedIterator :
+ public boost::iterator_adaptor<BoundedIterator<Iter>, Iter>
+{
+ public:
+ BoundedIterator(const Iter& begin, const Iter& end_) :
+ BoundedIterator::iterator_adaptor_(begin), end(end_) {}
+
+ operator Iter() const { return this->base_reference(); }
+
+ private:
+ typename boost::iterator_reference<Iter>::type dereference() const {
+ if (this->base_reference() == end) throw OutOfBoundsException();
+ return *(this->base_reference());
+ }
+
+ void increment() {
+ if (this->base_reference() == end) throw OutOfBoundsException();
+ ++this->base_reference();
+ }
+
+ /** Advance requires Iter to be comparable */
+ void advance(typename boost::iterator_difference<Iter>::type n) {
+ this->base_reference() += n;
+ if (this->base_reference() > end) throw OutOfBoundsException();
+ }
+
+ Iter end;
+ friend class boost::iterator_core_access;
+};
+} // namespace qpid
+
+#endif /*!QPID_BOUNDEDITERATOR_H*/
diff --git a/cpp/src/tests/BoundedIterator.cpp b/cpp/src/tests/BoundedIterator.cpp
new file mode 100644
index 0000000000..34e1a99cd8
--- /dev/null
+++ b/cpp/src/tests/BoundedIterator.cpp
@@ -0,0 +1,74 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#include "unit_test.h"
+#include "qpid/BoundedIterator.h"
+
+using namespace std;
+using namespace qpid;
+
+QPID_AUTO_TEST_SUITE(BoundedIteratorTestSuite)
+
+BOOST_AUTO_TEST_CASE(testIncrement) {
+ char* b="ab";
+ char* e=b+strlen(b);
+ BoundedIterator<char*> i(b,e);
+ BOOST_CHECK_EQUAL('a', *i);
+ ++i;
+ BOOST_CHECK_EQUAL('b', *i);
+ ++i;
+ BOOST_CHECK(static_cast<char*>(i) == e);
+ try {
+ ++i;
+ BOOST_FAIL("Expected exception");
+ }
+ catch (const OutOfBoundsException&) {}
+}
+
+BOOST_AUTO_TEST_CASE(testAdvance) {
+ char* b="abc";
+ char* e=b+strlen(b);
+ BoundedIterator<char*> i(b,e);
+ i += 2;
+ BOOST_CHECK_EQUAL('c', *i);
+ try {
+ i += 2;
+ BOOST_FAIL("Expected exception");
+ }
+ catch (const OutOfBoundsException&) {}
+}
+
+BOOST_AUTO_TEST_CASE(testDeref) {
+ char* b="ab";
+ char* e=b+strlen(b);
+ BoundedIterator<char*> i(b,e);
+ i += 2;
+ BOOST_CHECK(static_cast<char*>(i) == e);
+ try {
+ (void)*i;
+ BOOST_FAIL("Expected exception");
+ }
+ catch (const OutOfBoundsException&) {}
+}
+
+
+
+
+QPID_AUTO_TEST_SUITE_END()
diff --git a/cpp/src/tests/Makefile.am b/cpp/src/tests/Makefile.am
index 0baf1a2763..b246694b63 100644
--- a/cpp/src/tests/Makefile.am
+++ b/cpp/src/tests/Makefile.am
@@ -40,7 +40,7 @@ unit_test_SOURCES= unit_test.cpp unit_test.h \
ClientSessionTest.cpp \
SequenceSet.cpp \
serialize.cpp \
- ProxyTemplate.cpp apply.cpp
+ ProxyTemplate.cpp apply.cpp BoundedIterator.cpp
# FIXME aconway 2008-02-20: removed RefCountedMap.cpp due to valgrind error.
check_LTLIBRARIES += libshlibtest.la