@@ -70,17 +70,6 @@ namespace sqlite {
70
70
71
71
typedef std::shared_ptr<sqlite3> connection_type;
72
72
73
- template <typename Tuple, int Element = 0 , bool Last = (std::tuple_size<Tuple>::value == Element)> struct tuple_iterate {
74
- static void iterate(Tuple& t, database_binder& db) {
75
- get_col_from_db (db, Element, std::get<Element>(t));
76
- tuple_iterate<Tuple, Element + 1 >::iterate(t, db);
77
- }
78
- };
79
-
80
- template <typename Tuple, int Element> struct tuple_iterate <Tuple, Element, true > {
81
- static void iterate(Tuple&, database_binder&) {}
82
- };
83
-
84
73
class row_iterator ;
85
74
class database_binder {
86
75
@@ -270,12 +259,7 @@ namespace sqlite {
270
259
return *this ;
271
260
}
272
261
template <class ...Types>
273
- value_type &operator >>(std::tuple<Types...>& values) {
274
- assert (!next_index);
275
- tuple_iterate<std::tuple<Types...>>::iterate(values, *_binder);
276
- next_index = sizeof ...(Types) + 1 ;
277
- return *this ;
278
- }
262
+ value_type &operator >>(std::tuple<Types...>& values);
279
263
template <class ...Types>
280
264
value_type &operator >>(std::tuple<Types...>&& values) {
281
265
return *this >> values;
@@ -336,6 +320,27 @@ namespace sqlite {
336
320
mutable value_type value{_binder}; // mutable, because `changing` the value is just reading it
337
321
};
338
322
323
+ namespace detail {
324
+ template <typename Tuple, int Element = 0 , bool Last = (std::tuple_size<Tuple>::value == Element)> struct tuple_iterate {
325
+ static void iterate(Tuple& t, row_iterator::value_type& row) {
326
+ row >> std::get<Element>(t);
327
+ tuple_iterate<Tuple, Element + 1 >::iterate(t, row);
328
+ }
329
+ };
330
+
331
+ template <typename Tuple, int Element> struct tuple_iterate <Tuple, Element, true > {
332
+ static void iterate(Tuple&, row_iterator::value_type&) {}
333
+ };
334
+ }
335
+
336
+ template <class ...Types>
337
+ row_iterator::value_type &row_iterator::value_type::operator >>(std::tuple<Types...>& values) {
338
+ assert (!next_index);
339
+ detail::tuple_iterate<std::tuple<Types...>>::iterate(values, *this );
340
+ next_index = sizeof ...(Types) + 1 ;
341
+ return *this ;
342
+ }
343
+
339
344
inline row_iterator database_binder::begin () {
340
345
return row_iterator (*this );
341
346
}
0 commit comments