/
UCS
/
sqlite_orm
Обзор
Документация
Войти
/
UCS
/
sqlite_orm
Код
Запросы
0
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
dev/get_prepared_statement.h
172 строки
7 KB
klaus triendl
Implemented tuple filtering in terms of operating on index sequences
23 май 2022, 22:36
23 май 2022, 22:36
b6d328c
Код
Авторство
О чём код?
#pragma once #include <type_traits> // std::is_same, std::decay, std::remove_reference #include "functional/static_magic.h" #include "prepared_statement.h" #include "ast_iterator.h" #include "expression_object_type.h" namespace sqlite_orm { template<int N, class It, class L, class O> auto& get(internal::prepared_statement_t<internal::insert_range_t<It, L, O>>& statement) { return std::get<N>(statement.expression.range); } template<int N, class It, class L, class O> const auto& get(const internal::prepared_statement_t<internal::insert_range_t<It, L, O>>& statement) { return std::get<N>(statement.expression.range); } template<int N, class It, class L, class O> auto& get(internal::prepared_statement_t<internal::replace_range_t<It, L, O>>& statement) { return std::get<N>(statement.expression.range); } template<int N, class It, class L, class O> const auto& get(const internal::prepared_statement_t<internal::replace_range_t<It, L, O>>& statement) { return std::get<N>(statement.expression.range); } template<int N, class T, class... Ids> auto& get(internal::prepared_statement_t<internal::get_t<T, Ids...>>& statement) { return internal::get_ref(std::get<N>(statement.expression.ids)); } template<int N, class T, class... Ids> const auto& get(const internal::prepared_statement_t<internal::get_t<T, Ids...>>& statement) { return internal::get_ref(std::get<N>(statement.expression.ids)); } template<int N, class T, class... Ids> auto& get(internal::prepared_statement_t<internal::get_pointer_t<T, Ids...>>& statement) { return internal::get_ref(std::get<N>(statement.expression.ids)); } template<int N, class T, class... Ids> const auto& get(const internal::prepared_statement_t<internal::get_pointer_t<T, Ids...>>& statement) { return internal::get_ref(std::get<N>(statement.expression.ids)); } #ifdef SQLITE_ORM_OPTIONAL_SUPPORTED template<int N, class T, class... Ids> auto& get(internal::prepared_statement_t<internal::get_optional_t<T, Ids...>>& statement) { return internal::get_ref(std::get<N>(statement.expression.ids)); } template<int N, class T, class... Ids> const auto& get(const internal::prepared_statement_t<internal::get_optional_t<T, Ids...>>& statement) { return internal::get_ref(std::get<N>(statement.expression.ids)); } #endif // SQLITE_ORM_OPTIONAL_SUPPORTED template<int N, class T, class... Ids> auto& get(internal::prepared_statement_t<internal::remove_t<T, Ids...>>& statement) { return internal::get_ref(std::get<N>(statement.expression.ids)); } template<int N, class T, class... Ids> const auto& get(const internal::prepared_statement_t<internal::remove_t<T, Ids...>>& statement) { return internal::get_ref(std::get<N>(statement.expression.ids)); } template<int N, class T> auto& get(internal::prepared_statement_t<internal::update_t<T>>& statement) { static_assert(N == 0, "get<> works only with 0 argument for update statement"); return internal::get_ref(statement.expression.object); } template<int N, class T> const auto& get(const internal::prepared_statement_t<internal::update_t<T>>& statement) { static_assert(N == 0, "get<> works only with 0 argument for update statement"); return internal::get_ref(statement.expression.object); } template<int N, class T, class... Cols> auto& get(internal::prepared_statement_t<internal::insert_explicit<T, Cols...>>& statement) { static_assert(N == 0, "get<> works only with 0 argument for insert statement"); return internal::get_ref(statement.expression.obj); } template<int N, class T, class... Cols> const auto& get(const internal::prepared_statement_t<internal::insert_explicit<T, Cols...>>& statement) { static_assert(N == 0, "get<> works only with 0 argument for insert statement"); return internal::get_ref(statement.expression.obj); } template<int N, class T> auto& get(internal::prepared_statement_t<internal::replace_t<T>>& statement) { static_assert(N == 0, "get<> works only with 0 argument for replace statement"); return internal::get_ref(statement.expression.object); } template<int N, class T> const auto& get(const internal::prepared_statement_t<internal::replace_t<T>>& statement) { static_assert(N == 0, "get<> works only with 0 argument for replace statement"); return internal::get_ref(statement.expression.object); } template<int N, class T> auto& get(internal::prepared_statement_t<internal::insert_t<T>>& statement) { static_assert(N == 0, "get<> works only with 0 argument for insert statement"); return internal::get_ref(statement.expression.object); } template<int N, class T> const auto& get(const internal::prepared_statement_t<internal::insert_t<T>>& statement) { static_assert(N == 0, "get<> works only with 0 argument for insert statement"); return internal::get_ref(statement.expression.object); } template<int N, class T> const auto& get(const internal::prepared_statement_t<T>& statement) { using statement_type = std::decay_t<decltype(statement)>; using expression_type = typename statement_type::expression_type; using node_tuple = internal::node_tuple_t<expression_type>; using bind_tuple = internal::bindable_filter_t<node_tuple>; using result_type = std::tuple_element_t<static_cast<size_t>(N), bind_tuple>; const result_type* result = nullptr; internal::iterate_ast(statement.expression, [&result, index = -1](auto& node) mutable { using node_type = std::decay_t<decltype(node)>; if(internal::is_bindable_v<node_type>) { ++index; } if(index == N) { internal::call_if_constexpr<std::is_same<result_type, node_type>::value>( [](auto& r, auto& n) { r = &n; }, result, node); } }); return internal::get_ref(*result); } template<int N, class T> auto& get(internal::prepared_statement_t<T>& statement) { using statement_type = std::decay_t<decltype(statement)>; using expression_type = typename statement_type::expression_type; using node_tuple = internal::node_tuple_t<expression_type>; using bind_tuple = internal::bindable_filter_t<node_tuple>; using result_type = std::tuple_element_t<static_cast<size_t>(N), bind_tuple>; result_type* result = nullptr; internal::iterate_ast(statement.expression, [&result, index = -1](auto& node) mutable { using node_type = std::decay_t<decltype(node)>; if(internal::is_bindable_v<node_type>) { ++index; } if(index == N) { internal::call_if_constexpr<std::is_same<result_type, node_type>::value>( [](auto& r, auto& n) { r = const_cast<std::remove_reference_t<decltype(r)>>(&n); }, result, node); } }); return internal::get_ref(*result); } }