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