You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.9 KiB

  1. #pragma once
  2. #include "tables.h"
  3. #include "table.inl"
  4. namespace cpphibernate {
  5. namespace mariadb {
  6. namespace __impl
  7. {
  8. /* tables_builder */
  9. template<typename X, typename>
  10. struct tables_builder
  11. {
  12. template<typename... T_args>
  13. static constexpr decltype(auto) apply(T_args&&... args)
  14. { static_assert(sizeof...(args) == -1, "Invalid parameters for mariadb::make_tables(...)!"); }
  15. };
  16. template<
  17. typename T_owner,
  18. typename T_schema>
  19. struct tables_builder<
  20. mp::list<T_owner, T_schema>,
  21. mp::enable_if_t<
  22. mp::is_same_v<schema_t, mp::decay_t<T_owner>>
  23. && schema::is_schema_v<mp::decay_t<T_schema>>>>
  24. {
  25. template<typename T_index>
  26. static constexpr void emplace(
  27. tables_t& result,
  28. const schema_t& owner,
  29. const T_schema& schema,
  30. T_index&& index)
  31. {
  32. result.emplace_back(make_table(owner, schema, schema.tables[index]));
  33. }
  34. template<size_t... I>
  35. static decltype(auto) helper(
  36. const schema_t& owner,
  37. const T_schema& schema,
  38. std::index_sequence<I...> seq)
  39. {
  40. tables_t ret;
  41. ret.reserve(sizeof...(I));
  42. int dummy[] = { 0, (emplace(ret, owner, schema, hana::size_c<I>), void(), 0)... };
  43. (void) dummy;
  44. return ret;
  45. }
  46. static constexpr decltype(auto) apply(
  47. const schema_t& owner,
  48. const T_schema& schema)
  49. {
  50. using size = decltype(hana::size(schema.tables));
  51. return helper(owner, schema, std::make_index_sequence<size::value> { });
  52. }
  53. };
  54. }
  55. } }