diff options
-rw-r--r-- | src/context/cdlist_context_memory.h | 6 | ||||
-rw-r--r-- | test/unit/context/cdlist_black.h | 14 |
2 files changed, 19 insertions, 1 deletions
diff --git a/src/context/cdlist_context_memory.h b/src/context/cdlist_context_memory.h index 20d672d31..2fd1ceb8c 100644 --- a/src/context/cdlist_context_memory.h +++ b/src/context/cdlist_context_memory.h @@ -476,7 +476,11 @@ public: * Returns an iterator pointing to the first item in the list. */ const_iterator begin() const { - return const_iterator(&d_headSegment, 0); + // This looks curious, but we have to make sure that begin() == end() + // for an empty list, and begin() == (head,0) for a nonempty one. + // Since the segment spill-over is implemented in + // iterator::operator++(), let's reuse it. */ + return ++const_iterator(&d_headSegment, -1); } /** diff --git a/test/unit/context/cdlist_black.h b/test/unit/context/cdlist_black.h index aa25ba9eb..6541973bf 100644 --- a/test/unit/context/cdlist_black.h +++ b/test/unit/context/cdlist_black.h @@ -25,12 +25,15 @@ #include "memory.h" +#include "util/exception.h" #include "context/context.h" #include "context/cdlist.h" +#include "context/cdlist_context_memory.h" using namespace std; using namespace CVC4::context; using namespace CVC4::test; +using namespace CVC4; struct DtorSensitiveObject { bool& d_dtorCalled; @@ -133,6 +136,17 @@ public: TS_ASSERT_EQUALS(aThirdFalse, false); } + void testEmptyIterators() { + CDList<int>* list1 = new(true) CDList<int>(d_context); + CDList< int, ContextMemoryAllocator<int> >* list2 = + new(d_context->getCMM()) + CDList< int, ContextMemoryAllocator<int> >(true, d_context, false, + ContextMemoryAllocator<int>(d_context->getCMM())); + TS_ASSERT_EQUALS(list1->begin(), list1->end()); + TS_ASSERT_EQUALS(list2->begin(), list2->end()); + list1->deleteSelf(); + } + /* setrlimit() totally broken on Mac OS X */ void testOutOfMemory() { #ifdef __APPLE__ |