6
6
#endif
7
7
8
8
#include " functional/cxx_type_traits_polyfill.h"
9
+ #include " ast/labeled_bindable.h"
10
+ #include " ast/named_parameter.h"
9
11
#include " type_traits.h"
10
12
#include " prepared_statement.h"
11
13
#include " ast_iterator.h"
@@ -126,19 +128,22 @@ SQLITE_ORM_EXPORT namespace sqlite_orm {
126
128
127
129
template <int N, class T >
128
130
const auto & get (const internal::prepared_statement_t <T>& statement) {
131
+ using namespace ::sqlite_orm::internal;
129
132
using statement_type = polyfill::remove_cvref_t <decltype (statement)>;
130
- using expression_type = internal::expression_type_t <statement_type>;
131
- using node_tuple = internal::node_tuple_t <expression_type>;
132
- using bind_tuple = internal::bindable_filter_t <node_tuple>;
133
- using result_type = std::tuple_element_t <static_cast <size_t >(N), bind_tuple>;
133
+ using expression_type = expression_type_t <statement_type>;
134
+ using node_tuple = node_tuple_t <expression_type>;
135
+ using bind_tuple = bindable_filter_t <node_tuple>;
136
+ using bound_type = std::tuple_element_t <static_cast <size_t >(N), bind_tuple>;
137
+ using result_type = access_bindable_t <bound_type>;
138
+
134
139
const result_type* result = nullptr ;
135
- internal:: iterate_ast (statement.expression , [&result, index = -1 ](auto & node) mutable {
136
- using node_type = polyfill::remove_cvref_t <decltype (node)>;
137
- if constexpr (internal::is_bindable<node_type >::value) {
140
+ iterate_ast (statement.expression , [&result, index = -1 ](auto & node) mutable {
141
+ using leaf_type = polyfill::remove_cvref_t <decltype (node)>;
142
+ if constexpr (is_sql_parameter<leaf_type >::value) {
138
143
++index;
139
- if constexpr (std::is_same<result_type, node_type >::value) {
144
+ if constexpr (std::is_same<result_type, access_bindable_t <leaf_type> >::value) {
140
145
if (index == N) {
141
- result = &node;
146
+ result = &access_bindable ( node) ;
142
147
}
143
148
}
144
149
}
@@ -148,24 +153,86 @@ SQLITE_ORM_EXPORT namespace sqlite_orm {
148
153
149
154
template <int N, class T >
150
155
auto & get (internal::prepared_statement_t <T>& statement) {
156
+ using namespace ::sqlite_orm::internal;
151
157
using statement_type = std::remove_reference_t <decltype (statement)>;
152
- using expression_type = internal::expression_type_t <statement_type>;
153
- using node_tuple = internal::node_tuple_t <expression_type>;
154
- using bind_tuple = internal::bindable_filter_t <node_tuple>;
155
- using result_type = std::tuple_element_t <static_cast <size_t >(N), bind_tuple>;
158
+ using expression_type = expression_type_t <statement_type>;
159
+ using node_tuple = node_tuple_t <expression_type>;
160
+ using bind_tuple = bindable_filter_t <node_tuple>;
161
+ using bound_type = std::tuple_element_t <static_cast <size_t >(N), bind_tuple>;
162
+ using result_type = access_bindable_t <bound_type>;
163
+
156
164
result_type* result = nullptr ;
165
+ iterate_ast (statement.expression , [&result, index = -1 ](auto & node) mutable {
166
+ using leaf_type = polyfill::remove_cvref_t <decltype (node)>;
167
+ if constexpr (is_sql_parameter<leaf_type>::value) {
168
+ ++index;
169
+ if constexpr (std::is_same<result_type, access_bindable_t <leaf_type>>::value) {
170
+ if (index == N) {
171
+ result = const_cast <result_type*>(&access_bindable (node));
172
+ }
173
+ }
174
+ }
175
+ });
176
+ return internal::get_ref (*result);
177
+ }
178
+
179
+ #ifdef SQLITE_ORM_WITH_CPP20_ALIASES
180
+ template <auto name, class T >
181
+ requires (orm_parameter_moniker<decltype (name)> || orm_bindable_label<decltype(name)>)
182
+ const auto& access(const internal::prepared_statement_t <T>& statement) {
183
+ using namespace ::sqlite_orm::internal;
184
+ using statement_type = std::remove_cvref_t <decltype (statement)>;
185
+ using expression_type = expression_type_t <statement_type>;
186
+ using node_tuple = node_tuple_t <expression_type>;
187
+ using bind_tuple = bindable_filter_t <node_tuple>;
188
+ using index_type =
189
+ find_tuple_type<bind_tuple, name_constant_type_t <decltype (name)>, name_constant_type_or_none_t >;
190
+ constexpr size_t N = index_type::value;
191
+ static_assert (N < std::tuple_size_v<bind_tuple>, " No such named bindable found in prepared statement" );
192
+ using bound_type = std::tuple_element_t <N, bind_tuple>;
193
+ using result_type = access_bindable_t <bound_type>;
194
+
195
+ const result_type* result = nullptr ;
196
+ iterate_ast (statement.expression , [&result, index = -1 ]<class leaf_type >(const leaf_type& node) mutable {
197
+ if constexpr (is_sql_parameter<leaf_type>::value) {
198
+ ++index;
199
+ if constexpr (std::is_same_v<result_type, access_bindable_t <leaf_type>>) {
200
+ if (index == N) {
201
+ result = &access_bindable (node);
202
+ }
203
+ }
204
+ }
205
+ });
206
+ return internal::get_ref (*result);
207
+ }
157
208
158
- internal::iterate_ast (statement.expression , [&result, index = -1 ](auto & node) mutable {
159
- using node_type = polyfill::remove_cvref_t <decltype (node)>;
160
- if constexpr (internal::is_bindable<node_type>::value) {
209
+ template <auto name, class T >
210
+ requires (orm_parameter_moniker<decltype (name)> || orm_bindable_label<decltype(name)>)
211
+ auto& access(internal::prepared_statement_t <T>& statement) {
212
+ using namespace ::sqlite_orm::internal;
213
+ using statement_type = std::remove_cvref_t <decltype (statement)>;
214
+ using expression_type = expression_type_t <statement_type>;
215
+ using node_tuple = node_tuple_t <expression_type>;
216
+ using bind_tuple = bindable_filter_t <node_tuple>;
217
+ using index_type =
218
+ find_tuple_type<bind_tuple, name_constant_type_t <decltype (name)>, name_constant_type_or_none_t >;
219
+ constexpr size_t N = index_type::value;
220
+ static_assert (N < std::tuple_size_v<bind_tuple>, " No such named bindable found in prepared statement" );
221
+ using bound_type = std::tuple_element_t <N, bind_tuple>;
222
+ using result_type = access_bindable_t <bound_type>;
223
+
224
+ result_type* result = nullptr ;
225
+ iterate_ast (statement.expression , [&result, index = -1 ]<class leaf_type >(const leaf_type& node) mutable {
226
+ if constexpr (is_sql_parameter<leaf_type>::value) {
161
227
++index;
162
- if constexpr (std::is_same <result_type, node_type>::value ) {
228
+ if constexpr (std::is_same_v <result_type, access_bindable_t <leaf_type>> ) {
163
229
if (index == N) {
164
- result = const_cast <result_type*>(&node);
230
+ result = const_cast <result_type*>(&access_bindable ( node) );
165
231
}
166
232
}
167
233
}
168
234
});
169
235
return internal::get_ref (*result);
170
236
}
237
+ #endif
171
238
}
0 commit comments