Skip to content

Commit 5dcde6d

Browse files
committed
Fix RowIterator and Add bidirectional ColumnIterator
1 parent a81ee9e commit 5dcde6d

File tree

5 files changed

+96
-16
lines changed

5 files changed

+96
-16
lines changed

include/SQLiteCpp/Column.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ class Column
5555
mStatementPtr(aStatementPtr),
5656
mIndex(aIndex), mRowIndex(mStatementPtr->mCurrentStep) {}
5757

58-
Column(const Column&) = delete;
59-
Column& operator=(const Column&) = delete;
58+
Column(const Column&) noexcept = default;
59+
Column& operator=(const Column&) noexcept = default;
6060

6161
Column(Column&& aColumn) noexcept = default;
6262
Column& operator=(Column&& aColumn) noexcept = default;

include/SQLiteCpp/Row.h

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,73 @@ class Row
3535
return mID;
3636
}
3737

38+
/**
39+
* @brief RandomAccessIterator for row columns.
40+
*/
41+
class ColumnIterator
42+
{
43+
public:
44+
//TODO: using iterator_category = std::random_access_iterator_tag;
45+
using iterator_category = std::bidirectional_iterator_tag;
46+
using value_type = Column;
47+
using reference = const Column&;
48+
using pointer = const Column*;
49+
using difference_type = std::ptrdiff_t;
50+
51+
ColumnIterator() = default;
52+
ColumnIterator(TStatementPtr apStatement, uint16_t aID) :
53+
mpStatement(apStatement), mID(aID), mColumn(apStatement, aID) {}
54+
55+
reference operator*() const noexcept
56+
{
57+
return mColumn;
58+
}
59+
pointer operator->() const noexcept
60+
{
61+
return &mColumn;
62+
}
63+
64+
ColumnIterator& operator++() noexcept
65+
{
66+
mColumn = Column(mpStatement, ++mID);
67+
return *this;
68+
}
69+
ColumnIterator operator++(int) noexcept
70+
{
71+
ColumnIterator copy{ *this };
72+
mColumn = Column(mpStatement, ++mID);
73+
return copy;
74+
}
75+
ColumnIterator& operator--() noexcept
76+
{
77+
mColumn = Column(mpStatement, --mID);
78+
return *this;
79+
}
80+
ColumnIterator operator--(int) noexcept
81+
{
82+
ColumnIterator copy{ *this };
83+
mColumn = Column(mpStatement, --mID);
84+
return copy;
85+
}
86+
87+
bool operator==(const ColumnIterator& aIt) const noexcept;
88+
bool operator!=(const ColumnIterator& aIt) const noexcept
89+
{
90+
return !(*this == aIt);
91+
}
92+
93+
private:
94+
TStatementPtr mpStatement{}; //!< Shared pointer to prepared Statement Object
95+
std::size_t mRowID{}; //!< Current row number
96+
uint16_t mID{}; //!< Current column number
97+
98+
/// Internal column object storage
99+
Column mColumn{ mpStatement, mID };
100+
};
101+
38102
private:
39103
TStatementWeakPtr mpStatement;
40-
std::size_t mID;
104+
std::size_t mID;
41105
};
42106

43107
} // namespace SQLite

include/SQLiteCpp/StatementExecutor.h

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,8 @@ class StatementExecutor
173173
using pointer = const Row*;
174174
using difference_type = std::ptrdiff_t;
175175

176-
RowIterator() = default;
177-
RowIterator(TStatementWeakPtr apStatement, uint16_t aID) :
178-
mpStatement(apStatement), mID(aID), mRow(apStatement, aID) {}
176+
explicit RowIterator(TStatementWeakPtr apStatement = TStatementWeakPtr{}) :
177+
mpStatement(apStatement) {}
179178

180179
reference operator*() const noexcept
181180
{
@@ -188,16 +187,13 @@ class StatementExecutor
188187

189188
RowIterator& operator++() noexcept
190189
{
191-
mRow = Row(mpStatement, ++mID);
192190
advance();
193191
return *this;
194192
}
195-
/// Prefer to use prefix increment (++it)
196-
RowIterator operator++(int) noexcept
193+
RowIterator& operator++(int) noexcept
197194
{
198-
RowIterator copy{ *this };
199195
advance();
200-
return copy;
196+
return *this;
201197
}
202198

203199
bool operator==(const RowIterator& aIt) const noexcept;
@@ -210,8 +206,8 @@ class StatementExecutor
210206
/// Executing next statement step
211207
void advance() noexcept;
212208

213-
TStatementWeakPtr mpStatement{}; //!< Weak pointer to prepared Statement Object
214-
uint16_t mID{}; //!< Current row number
209+
TStatementWeakPtr mpStatement{}; //!< Weak pointer to prepared Statement Object
210+
std::size_t mID{}; //!< Current row number
215211

216212
/// Internal row object storage
217213
Row mRow{ mpStatement, mID };

src/Row.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,22 @@ namespace SQLite
1919
{
2020

2121

22+
bool Row::ColumnIterator::operator==(const ColumnIterator& aIt) const noexcept
23+
{
24+
const auto& left = mpStatement;
25+
const auto& right = aIt.mpStatement;
26+
27+
if (mID != aIt.mID)
28+
return false;
29+
30+
if (!left && !right)
31+
return true;
32+
33+
if (left != right)
34+
return false;
35+
36+
return mRowID == aIt.mRowID;
37+
}
38+
2239

2340
} // namespace SQLite

src/StatementExecutor.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
* Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt
1010
* or copy at http://opensource.org/licenses/MIT)
1111
*/
12+
#include <iterator>
1213
#include <SQLiteCpp/StatementExecutor.h>
1314

1415
#include <SQLiteCpp/Exception.h>
@@ -148,7 +149,7 @@ namespace SQLite
148149
{
149150
reset();
150151
tryExecuteStep();
151-
return StatementExecutor::RowIterator(mpStatement, 0);
152+
return StatementExecutor::RowIterator(mpStatement);
152153
}
153154

154155
StatementExecutor::RowIterator StatementExecutor::end() noexcept
@@ -158,6 +159,8 @@ namespace SQLite
158159

159160
void StatementExecutor::RowIterator::advance() noexcept
160161
{
162+
mRow = Row(mpStatement, ++mID);
163+
161164
if (mpStatement.expired())
162165
return;
163166

@@ -173,8 +176,8 @@ namespace SQLite
173176

174177
bool StatementExecutor::RowIterator::operator==(const RowIterator& aIt) const noexcept
175178
{
176-
auto left = mpStatement.lock();
177-
auto right = aIt.mpStatement.lock();
179+
const auto left = mpStatement.lock();
180+
const auto right = aIt.mpStatement.lock();
178181

179182
if (!left && !right)
180183
return true;

0 commit comments

Comments
 (0)