@@ -51,17 +51,6 @@ namespace sqlite {
51
51
52
52
typedef std::shared_ptr<sqlite3> connection_type;
53
53
54
- template <typename Tuple, int Element = 0 , bool Last = (std::tuple_size<Tuple>::value == Element)> struct tuple_iterate {
55
- static void iterate(Tuple& t, database_binder& db) {
56
- get_col_from_db (db, Element, std::get<Element>(t));
57
- tuple_iterate<Tuple, Element + 1 >::iterate(t, db);
58
- }
59
- };
60
-
61
- template <typename Tuple, int Element> struct tuple_iterate <Tuple, Element, true > {
62
- static void iterate(Tuple&, database_binder&) {}
63
- };
64
-
65
54
class row_iterator ;
66
55
class database_binder {
67
56
@@ -251,12 +240,7 @@ namespace sqlite {
251
240
return *this ;
252
241
}
253
242
template <class ...Types>
254
- value_type &operator >>(std::tuple<Types...>& values) {
255
- assert (!next_index);
256
- tuple_iterate<std::tuple<Types...>>::iterate(values, *_binder);
257
- next_index = sizeof ...(Types) + 1 ;
258
- return *this ;
259
- }
243
+ value_type &operator >>(std::tuple<Types...>& values);
260
244
template <class ...Types>
261
245
value_type &operator >>(std::tuple<Types...>&& values) {
262
246
return *this >> values;
@@ -317,6 +301,27 @@ namespace sqlite {
317
301
mutable value_type value{_binder}; // mutable, because `changing` the value is just reading it
318
302
};
319
303
304
+ namespace detail {
305
+ template <typename Tuple, int Element = 0 , bool Last = (std::tuple_size<Tuple>::value == Element)> struct tuple_iterate {
306
+ static void iterate(Tuple& t, row_iterator::value_type& row) {
307
+ row >> std::get<Element>(t);
308
+ tuple_iterate<Tuple, Element + 1 >::iterate(t, row);
309
+ }
310
+ };
311
+
312
+ template <typename Tuple, int Element> struct tuple_iterate <Tuple, Element, true > {
313
+ static void iterate(Tuple&, row_iterator::value_type&) {}
314
+ };
315
+ }
316
+
317
+ template <class ...Types>
318
+ row_iterator::value_type &row_iterator::value_type::operator >>(std::tuple<Types...>& values) {
319
+ assert (!next_index);
320
+ detail::tuple_iterate<std::tuple<Types...>>::iterate(values, *this );
321
+ next_index = sizeof ...(Types) + 1 ;
322
+ return *this ;
323
+ }
324
+
320
325
inline row_iterator database_binder::begin () {
321
326
return row_iterator (*this );
322
327
}
0 commit comments