diff --git a/include/xlnt/workbook/worksheet_iterator.hpp b/include/xlnt/workbook/worksheet_iterator.hpp
index 444b792f..f575dc7c 100644
--- a/include/xlnt/workbook/worksheet_iterator.hpp
+++ b/include/xlnt/workbook/worksheet_iterator.hpp
@@ -119,6 +119,18 @@ public:
///
worksheet_iterator &operator++();
+ ///
+ /// Post-decrement the iterator's internal workseet index. Returns a copy of the
+ /// iterator as it was before being incremented.
+ ///
+ worksheet_iterator operator--(int);
+
+ ///
+ /// Pre-decrement the iterator's internal workseet index. Returns a refernce
+ /// to the same iterator.
+ ///
+ worksheet_iterator &operator--();
+
private:
///
/// The target workbook of this iterator.
@@ -206,6 +218,18 @@ public:
///
const_worksheet_iterator &operator++();
+ ///
+ /// Post-decrement the iterator's internal workseet index. Returns a copy of the
+ /// iterator as it was before being incremented.
+ ///
+ const_worksheet_iterator operator--(int);
+
+ ///
+ /// Pre-decrement the iterator's internal workseet index. Returns a refernce
+ /// to the same iterator.
+ ///
+ const_worksheet_iterator &operator--();
+
private:
///
/// The target workbook of this iterator.
diff --git a/source/workbook/worksheet_iterator.cpp b/source/workbook/worksheet_iterator.cpp
index 3c981339..b1432e33 100644
--- a/source/workbook/worksheet_iterator.cpp
+++ b/source/workbook/worksheet_iterator.cpp
@@ -55,6 +55,19 @@ worksheet_iterator worksheet_iterator::operator++(int)
return old;
}
+worksheet_iterator &worksheet_iterator::operator--()
+{
+ --index_;
+ return *this;
+}
+
+worksheet_iterator worksheet_iterator::operator--(int)
+{
+ worksheet_iterator old(*wb_, index_);
+ --(*this);
+ return old;
+}
+
bool worksheet_iterator::operator==(const worksheet_iterator &comparand) const
{
return index_ == comparand.index_ && wb_ == comparand.wb_;
@@ -88,6 +101,19 @@ const_worksheet_iterator const_worksheet_iterator::operator++(int)
return old;
}
+const_worksheet_iterator &const_worksheet_iterator::operator--()
+{
+ --index_;
+ return *this;
+}
+
+const_worksheet_iterator const_worksheet_iterator::operator--(int)
+{
+ const_worksheet_iterator old(*wb_, index_);
+ --(*this);
+ return old;
+}
+
bool const_worksheet_iterator::operator==(const const_worksheet_iterator &comparand) const
{
return index_ == comparand.index_ && wb_ == comparand.wb_;
diff --git a/tests/workbook/workbook_test_suite.hpp b/tests/workbook/workbook_test_suite.hpp
index cbd4bda3..8a69a9cd 100644
--- a/tests/workbook/workbook_test_suite.hpp
+++ b/tests/workbook/workbook_test_suite.hpp
@@ -45,6 +45,7 @@ public:
register_test(test_index_operator);
register_test(test_contains);
register_test(test_iter);
+ register_test(test_const_iter);
register_test(test_get_index);
register_test(test_get_sheet_names);
register_test(test_add_named_range);
@@ -153,17 +154,84 @@ public:
xlnt_assert(wb.contains("Sheet1"));
xlnt_assert(!wb.contains("NotThere"));
}
-
+
void test_iter()
{
xlnt::workbook wb;
-
- for(auto ws : wb)
+
+ for (auto ws : wb)
{
xlnt_assert_equals(ws.title(), "Sheet1");
}
+
+ xlnt::workbook wb2;
+ auto iter = wb.begin();
+ auto iter_copy(iter); // copy ctor
+ xlnt_assert_equals(iter, iter_copy);
+ auto begin_2(wb2.begin());
+ xlnt_assert_differs(begin_2, iter);
+ iter = begin_2; // copy assign
+ xlnt_assert_equals(iter, begin_2);
+ iter = wb.begin();
+ iter = std::move(begin_2);
+ xlnt_assert_equals(iter, wb2.begin());
+
+ auto citer = wb.cbegin();
+ auto citer_copy(citer); // copy ctor
+ xlnt_assert_equals(citer, citer_copy);
+ auto cbegin_2(wb2.cbegin());
+ xlnt_assert_differs(cbegin_2, citer);
+ citer = cbegin_2; // copy assign
+ xlnt_assert_equals(citer, cbegin_2);
+ citer = wb.cbegin();
+ citer = std::move(cbegin_2);
+ xlnt_assert_equals(citer, wb2.cbegin());
+
+ wb2.create_sheet(); // wb2 iterators assumed invalidated
+ iter = wb2.begin();
+ xlnt_assert_equals((*iter).title(), "Sheet1");
+ ++iter;
+ xlnt_assert_differs(iter, wb2.begin());
+ xlnt_assert_equals((*iter).title(), "Sheet2");
+ --iter;
+ xlnt_assert_equals((*iter).title(), "Sheet1");
+ std::advance(iter, 2);
+ xlnt_assert_equals(iter, wb2.end());
}
-
+
+ void test_const_iter()
+ {
+ const xlnt::workbook wb;
+
+ for (auto ws : wb)
+ {
+ xlnt_assert_equals(ws.title(), "Sheet1");
+ }
+
+ xlnt::workbook wb2;
+ auto iter = wb.cbegin();
+ auto iter_copy(iter); // copy ctor
+ xlnt_assert_equals(iter, iter_copy);
+ auto begin_2(wb2.cbegin());
+ xlnt_assert_differs(begin_2, iter);
+ iter = begin_2; // copy assign
+ xlnt_assert_equals(iter, begin_2);
+ iter = wb.cbegin();
+ iter = std::move(begin_2);
+ xlnt_assert_equals(iter, wb2.cbegin());
+
+ wb2.create_sheet(); // wb2 iterators assumed invalidated
+ iter = wb2.cbegin();
+ xlnt_assert_equals((*iter).title(), "Sheet1");
+ ++iter;
+ xlnt_assert_differs(iter, wb2.cbegin());
+ xlnt_assert_equals((*iter).title(), "Sheet2");
+ --iter;
+ xlnt_assert_equals((*iter).title(), "Sheet1");
+ std::advance(iter, 2);
+ xlnt_assert_equals(iter, wb2.cend());
+ }
+
void test_get_index()
{
xlnt::workbook wb;