|
28 | 28 | #define SQLPP11_SELECT_COLUMN_LIST_H |
29 | 29 |
|
30 | 30 | #include <sqlpp11/data_types/no_value.h> |
31 | | -#include <sqlpp11/detail/copy_tuple_args.h> |
| 31 | +#include <sqlpp11/auto_alias.h> |
32 | 32 | #include <sqlpp11/detail/type_set.h> |
33 | 33 | #include <sqlpp11/dynamic_select_column_list.h> |
34 | 34 | #include <sqlpp11/expression_fwd.h> |
@@ -291,9 +291,26 @@ namespace sqlpp |
291 | 291 |
|
292 | 292 | namespace detail |
293 | 293 | { |
| 294 | + template <typename T> |
| 295 | + std::tuple<auto_alias_t<T>> as_column_tuple(T t) |
| 296 | + { |
| 297 | + return std::tuple<auto_alias_t<T>>(auto_alias_t<T>{t}); |
| 298 | + } |
| 299 | + |
| 300 | + template <typename... Args> |
| 301 | + std::tuple<auto_alias_t<Args>...> as_column_tuple(std::tuple<Args...> t) |
| 302 | + { |
| 303 | + return t; |
| 304 | + } |
| 305 | + |
| 306 | + template <typename... Columns> |
| 307 | + auto column_tuple_merge(Columns... columns) -> decltype(std::tuple_cat(as_column_tuple(columns)...)) |
| 308 | + { |
| 309 | + return std::tuple_cat(as_column_tuple(columns)...); |
| 310 | + } |
| 311 | + |
294 | 312 | template <typename Database, typename... Columns> |
295 | | - using make_select_column_list_t = |
296 | | - copy_tuple_args_t<select_column_list_t, Database, decltype(column_tuple_merge(std::declval<Columns>()...))>; |
| 313 | + select_column_list_t<Database, Columns...> make_column_list(std::tuple<Columns...> columns); |
297 | 314 | } // namespace detail |
298 | 315 |
|
299 | 316 | SQLPP_PORTABLE_STATIC_ASSERT(assert_selected_colums_are_selectable_t, "selected columns must be selectable"); |
@@ -362,43 +379,41 @@ namespace sqlpp |
362 | 379 | using _database_t = typename Policies::_database_t; |
363 | 380 |
|
364 | 381 | template <typename... T> |
365 | | - static constexpr auto _check_tuple(std::tuple<T...> /*unused*/) -> check_selected_columns_t<T...> |
| 382 | + static constexpr auto _check_args(std::tuple<T...> args) -> check_selected_columns_t<T...> |
366 | 383 | { |
367 | 384 | return {}; |
368 | 385 | } |
369 | 386 |
|
370 | | - template <typename... T> |
371 | | - static constexpr auto _check_args(T... args) -> decltype(_check_tuple(detail::column_tuple_merge(args...))) |
372 | | - { |
373 | | - return _check_tuple(detail::column_tuple_merge(args...)); |
374 | | - } |
375 | | - |
376 | 387 | template <typename Check, typename T> |
377 | 388 | using _new_statement_t = new_statement_t<Check, Policies, no_select_column_list_t, T>; |
378 | 389 |
|
379 | 390 | using _consistency_check = consistent_t; |
380 | 391 |
|
381 | 392 | template <typename... Args> |
382 | 393 | auto columns(Args... args) const |
383 | | - -> _new_statement_t<decltype(_check_args(args...)), detail::make_select_column_list_t<void, Args...>> |
| 394 | + -> _new_statement_t<decltype(_check_args(detail::column_tuple_merge(args...))), |
| 395 | + decltype(detail::make_column_list<void>(detail::column_tuple_merge(args...)))> |
384 | 396 | { |
385 | 397 | static_assert(sizeof...(Args), "at least one selectable expression (e.g. a column) required in columns()"); |
386 | | - static_assert(decltype(_check_args(args...))::value, |
| 398 | + using check = decltype(_check_args(detail::column_tuple_merge(args...))); |
| 399 | + static_assert(check::value, |
387 | 400 | "at least one argument is not a selectable expression in columns()"); |
388 | 401 |
|
389 | | - return _columns_impl<void>(decltype(_check_args(args...)){}, detail::column_tuple_merge(args...)); |
| 402 | + return _columns_impl<void>(check{}, detail::column_tuple_merge(args...)); |
390 | 403 | } |
391 | 404 |
|
392 | 405 | template <typename... Args> |
393 | 406 | auto dynamic_columns(Args... args) const |
394 | | - -> _new_statement_t<decltype(_check_args(args...)), detail::make_select_column_list_t<_database_t, Args...>> |
| 407 | + -> _new_statement_t<decltype(_check_args(detail::column_tuple_merge(args...))), |
| 408 | + decltype(detail::make_column_list<_database_t>(detail::column_tuple_merge(args...)))> |
395 | 409 | { |
396 | 410 | static_assert(not std::is_same<_database_t, void>::value, |
397 | 411 | "dynamic_columns must not be called in a static statement"); |
398 | | - static_assert(decltype(_check_args(args...))::value, |
| 412 | + using check = decltype(_check_args(detail::column_tuple_merge(args...))); |
| 413 | + static_assert(check::value, |
399 | 414 | "at least one argument is not a selectable expression in columns()"); |
400 | 415 |
|
401 | | - return _columns_impl<_database_t>(decltype(_check_args(args...)){}, detail::column_tuple_merge(args...)); |
| 416 | + return _columns_impl<_database_t>(check{}, detail::column_tuple_merge(args...)); |
402 | 417 | } |
403 | 418 |
|
404 | 419 | private: |
|
0 commit comments