You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2008/03/26 15:01:39 UTC
svn commit: r641315 - in /incubator/qpid/trunk/qpid/cpp/src: Makefile.am
qpid/BoundedIterator.h tests/BoundedIterator.cpp tests/Makefile.am
Author: aconway
Date: Wed Mar 26 07:01:38 2008
New Revision: 641315
URL: http://svn.apache.org/viewvc?rev=641315&view=rev
Log:
Bounds-checking iterator wrapper, for use with Codec::encode/decode.
Added:
incubator/qpid/trunk/qpid/cpp/src/qpid/BoundedIterator.h (with props)
incubator/qpid/trunk/qpid/cpp/src/tests/BoundedIterator.cpp (with props)
Modified:
incubator/qpid/trunk/qpid/cpp/src/Makefile.am
incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am
Modified: incubator/qpid/trunk/qpid/cpp/src/Makefile.am
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/Makefile.am?rev=641315&r1=641314&r2=641315&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/Makefile.am Wed Mar 26 07:01:38 2008
@@ -145,6 +145,7 @@
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 \
Added: incubator/qpid/trunk/qpid/cpp/src/qpid/BoundedIterator.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/BoundedIterator.h?rev=641315&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/BoundedIterator.h (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/BoundedIterator.h Wed Mar 26 07:01:38 2008
@@ -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*/
Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/BoundedIterator.h
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/BoundedIterator.h
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/qpid/trunk/qpid/cpp/src/tests/BoundedIterator.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/BoundedIterator.cpp?rev=641315&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/BoundedIterator.cpp (added)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/BoundedIterator.cpp Wed Mar 26 07:01:38 2008
@@ -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()
Propchange: incubator/qpid/trunk/qpid/cpp/src/tests/BoundedIterator.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/qpid/trunk/qpid/cpp/src/tests/BoundedIterator.cpp
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am?rev=641315&r1=641314&r2=641315&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am Wed Mar 26 07:01:38 2008
@@ -40,7 +40,7 @@
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