|
- #pragma once
-
- #include "field.h"
-
- namespace cpphibernate {
- namespace mariadb {
-
- namespace __impl
- {
-
- /* fields_builder */
-
- template<typename X, typename>
- struct fields_builder
- {
- template<typename... T_args>
- static constexpr decltype(auto) apply(T_args&&... args)
- { static_assert(sizeof...(args) == -1, "Invalid parameters for mariadb::make_fields(...)!"); }
- };
-
- template<typename T_owner, typename T_schema, typename T_table>
- struct fields_builder<
- mp::list<T_owner, T_schema, T_table>,
- mp::enable_if_t<
- mp::is_same_v<table_t, mp::decay_t<T_owner>>
- && schema::is_schema_v<mp::decay_t<T_schema>>
- && schema::is_table_v<mp::decay_t<T_table>>>>
- {
- template<typename T_index>
- static constexpr void emplace(
- fields_t& result,
- const table_t& owner,
- const T_schema& schema,
- const T_table& table,
- T_index&& index)
- {
- result.emplace_back(make_field(owner, schema, table, table.fields[index]));
- }
-
- template<size_t... I>
- static auto helper(
- const table_t& owner,
- const T_schema& schema,
- const T_table& table,
- std::index_sequence<I...>&&)
- {
- fields_t ret;
- int dummy[] = { 0, (emplace(ret, owner, schema, table, hana::size_c<I>), void(), 0)... };
- (void) dummy;
- return ret;
- }
-
- static constexpr decltype(auto) apply(
- const table_t& owner, const T_schema& schema, const T_table& table)
- {
- using size = decltype(hana::size(table.fields));
- return helper(owner, schema, table, std::make_index_sequence<size::value> { });
- }
- };
-
- }
-
- } }
|