pg_async
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
resultset.inl
Go to the documentation of this file.
1 /*
2  * resultset.inl
3  *
4  * Created on: Jul 16, 2015
5  * Author: zmij
6  */
7 
8 #ifndef TIP_DB_PG_RESULTSET_INL_
9 #define TIP_DB_PG_RESULTSET_INL_
10 
11 #include <tip/db/pg/resultset.hpp>
12 #include <tip/util/meta_helpers.hpp>
13 
14 namespace tip {
15 namespace db {
16 namespace pg {
17 
18 namespace detail {
19 
20 
21 template < size_t Index, typename T >
22 struct nth_field {
23  enum {
24  index = Index
25  };
26  typedef T type;
27 
28  nth_field(resultset::row const& r) : row(r)
29  {
30  }
31 
32  T value()
33  {
34  return row[index].template as<T>();
35  }
36 
37  void
38  to(T& val)
39  {
40  row[index].to(val);
41  }
42 
43  resultset::row row;
44 };
45 
46 template < typename IndexTuple, typename ... T >
47 struct row_data_extractor_base;
48 
49 template < size_t ... Indexes, typename ... T >
50 struct row_data_extractor_base< util::indexes_tuple< Indexes ... >, T ... > {
51  enum {
52  size = sizeof ... (T)
53  };
54 
55  static void
56  get_tuple( resultset::row const& row, std::tuple< T ... >& val )
57  {
58  std::tuple< T ... > tmp( nth_field< Indexes, T >(row).value() ... );
59  tmp.swap(val);
60  }
61 
62  static void
63  get_values( resultset::row const& row, T& ... val )
64  {
65  util::expand(nth_field< Indexes, T >(row).to(val) ...);
66  }
67 };
68 
69 template < typename ... T >
70 struct row_data_extractor :
71  row_data_extractor_base < typename util::index_builder< sizeof ... (T) >::type, T ... > {
72 };
73 
74 } // namespace detail
75 
76 template < typename ... T >
77 void
78 resultset::row::to(std::tuple< T ... >& val) const
79 {
80  detail::row_data_extractor< T ... >::get_tuple(*this, val);
81 }
82 
83 template < typename ... T >
84 void
85 resultset::row::to(std::tuple< T& ... > val) const
86 {
87  std::tuple<T ... > non_ref;
88  detail::row_data_extractor< T ... >::get_tuple(*this, non_ref);
89  val = non_ref;
90 }
91 
92 template < typename ... T >
93 void
94 resultset::row::to(T& ... val) const
95 {
96  detail::row_data_extractor< T ... >::get_values(val ...);
97 }
98 
99 } // namespace pg
100 } // namespace db
101 } // namespace tip
102 
103 
104 #endif /* TIP_DB_PG_RESULTSET_INL_ */
void to(std::tuple< T... > &) const
Definition: resultset.inl:78