Add has_value to cell_iterator

When iterating over a range that doesn't ignore null rows/columns,
the operator*() throws when dereferencing an iterator to a null cell.
Add has_value() to cell_iterator to be able to make a check without
relying on exceptions.
And add a test case.
This commit is contained in:
Félix Bourbonnais 2021-12-08 15:49:14 -05:00
parent 20f3dac28b
commit 28f7e6fa69
3 changed files with 48 additions and 0 deletions

View File

@ -136,6 +136,13 @@ public:
/// </summary> /// </summary>
cell_iterator operator++(int); cell_iterator operator++(int);
/// <summary>
/// When iterating over a range that doesn't ignore null cells, operator*()
/// will throw when trying to access the cells that are null. This method
/// checks the existence of a cell.
/// </summary>
bool has_value() const;
private: private:
/// <summary> /// <summary>
/// If true, cells that don't exist in the worksheet will be skipped during iteration. /// If true, cells that don't exist in the worksheet will be skipped during iteration.
@ -263,6 +270,13 @@ public:
/// </summary> /// </summary>
const_cell_iterator operator++(int); const_cell_iterator operator++(int);
/// <summary>
/// When iterating over a range that doesn't ignore null cells, operator*()
/// will throw when trying to access the cells that are null. This method
/// checks the existence of a cell.
/// </summary>
bool has_value() const;
private: private:
/// <summary> /// <summary>
/// If true, cells that don't exist in the worksheet will be skipped during iteration. /// If true, cells that don't exist in the worksheet will be skipped during iteration.

View File

@ -278,4 +278,12 @@ const const_cell_iterator::reference const_cell_iterator::operator*() const
{ {
return ws_.cell(cursor_); return ws_.cell(cursor_);
} }
bool cell_iterator::has_value() const{
return ws_.has_cell(cursor_);
}
bool const_cell_iterator::has_value() const{
return ws_.has_cell(cursor_);
}
} // namespace xlnt } // namespace xlnt

View File

@ -78,6 +78,7 @@ public:
register_test(test_lowest_row_or_props); register_test(test_lowest_row_or_props);
register_test(test_highest_row); register_test(test_highest_row);
register_test(test_highest_row_or_props); register_test(test_highest_row_or_props);
register_test(test_iterator_has_value);
register_test(test_const_iterators); register_test(test_const_iterators);
register_test(test_const_reverse_iterators); register_test(test_const_reverse_iterators);
register_test(test_column_major_iterators); register_test(test_column_major_iterators);
@ -584,6 +585,31 @@ public:
xlnt_assert_equals(ws.highest_row_or_props(), 11); xlnt_assert_equals(ws.highest_row_or_props(), 11);
} }
void test_iterator_has_value()
{
xlnt::workbook wb;
auto ws = wb.active_sheet();
// make a worksheet with a blank row and column
ws.cell("A1").value("A1");
ws.cell("A3").value("A3");
ws.cell("C1").value("C1");
xlnt_assert_equals(ws.columns(false)[0].begin().has_value(), true);
xlnt_assert_equals(ws.rows(false)[0].begin().has_value(), true);
xlnt_assert_equals(ws.columns(false)[1].begin().has_value(), false);
xlnt_assert_equals(ws.rows(false)[1].begin().has_value(), false);
// also test const interators.
xlnt_assert_equals(ws.columns(false)[0].cbegin().has_value(), true);
xlnt_assert_equals(ws.rows(false)[0].cbegin().has_value(), true);
xlnt_assert_equals(ws.columns(false)[1].cbegin().has_value(), false);
xlnt_assert_equals(ws.rows(false)[1].cbegin().has_value(), false);
}
void test_const_iterators() void test_const_iterators()
{ {
xlnt::workbook wb; xlnt::workbook wb;