Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

100 wiersze
3.4 KiB

  1. #pragma once
  2. #include <cpphibernate/schema/schema.inl>
  3. #include "table.h"
  4. #include "table_simple.inl"
  5. #include "table_polymorphic.inl"
  6. namespace cpphibernate {
  7. namespace mariadb {
  8. /* table_t */
  9. template<
  10. typename T_schema,
  11. typename T_table>
  12. table_t::table_t(
  13. const schema_t& p_owner,
  14. const T_schema& p_schema,
  15. const T_table& p_table)
  16. : id (hana::value(p_table.table_id))
  17. , dataset_id(get_type_id(p_table.wrapped_dataset))
  18. , name (p_table.name)
  19. , schema (p_owner)
  20. , fields (make_fields(*this, p_schema, p_table))
  21. { }
  22. namespace __impl
  23. {
  24. /* table_builder */
  25. template<typename X, typename>
  26. struct table_builder
  27. {
  28. template<typename... T_args>
  29. static constexpr decltype(auto) apply(T_args&&... args)
  30. { static_assert(sizeof...(args) == 0, "Invalid parameters for mariadb::make_table(...)!"); }
  31. };
  32. template<typename T_owner, typename T_schema, typename T_table>
  33. struct table_builder<
  34. mp::list<T_owner, T_schema, T_table>,
  35. mp::enable_if_t<
  36. mp::is_same_v<schema_t, mp::decay_t<T_owner>>
  37. && schema::is_schema_v<mp::decay_t<T_schema>>
  38. && schema::is_table_v<mp::decay_t<T_table>>>>
  39. {
  40. /* table_type */
  41. template<
  42. typename T_dataset,
  43. typename T_base_dataset,
  44. typename T_derived_datasets,
  45. typename = void>
  46. struct table_type
  47. { using type = table_simple_t /* table_simple_t<mp::decay_t<T_schema>, mp::decay_t<T_table>, T_base_dataset> */; };
  48. template<
  49. typename T_dataset,
  50. typename T_base_dataset,
  51. typename T_derived_datasets>
  52. struct table_type<
  53. T_dataset,
  54. T_base_dataset,
  55. T_derived_datasets,
  56. mp::enable_if_t<
  57. decltype(hana::size(std::declval<T_derived_datasets>()) != hana::size_c<0>)::value
  58. || decltype(hana::not_equal(std::declval<T_base_dataset>(), hana::type_c<void>))::value>>
  59. { using type = table_polymorphic_t /* table_polymorphic_t<mp::decay_t<T_schema>, mp::decay_t<T_table>, T_base_dataset> */; };
  60. template<
  61. typename T_dataset,
  62. typename T_base_dataset,
  63. typename T_derived_datasets>
  64. using table_type_t = typename table_type<T_dataset, T_base_dataset, T_derived_datasets>::type;
  65. /* apply */
  66. static decltype(auto) apply(const schema_t& owner, const T_schema& schema, const T_table& table)
  67. {
  68. using dataset_type = decltype(+table.wrapped_dataset);
  69. using base_dataset_type = mp::decay_t<decltype(schema::get_base_type(schema, table.wrapped_dataset))>;
  70. using derived_datasets_type = mp::decay_t<decltype(schema::get_derived_types(schema, table.wrapped_dataset))>;
  71. using table_type = table_type_t<dataset_type, base_dataset_type, derived_datasets_type>;
  72. return std::make_unique<table_type>(
  73. owner, schema, table,
  74. base_dataset_type { }, derived_datasets_type { });
  75. }
  76. };
  77. }
  78. } }