Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

211 linhas
8.1 KiB

  1. #pragma once
  2. #include "context.h"
  3. namespace cpphibernate
  4. {
  5. namespace __impl
  6. {
  7. /* init_builder */
  8. template<typename X, typename = void>
  9. struct init_builder
  10. {
  11. template<typename... T_args>
  12. static constexpr decltype(auto) apply(T_args&&...)
  13. { static_assert(sizeof...(T_args) == -1, "Invalid parameters for context::init(...)!"); }
  14. };
  15. template<typename T_impl, typename T_bool>
  16. struct init_builder<
  17. mp::list<T_impl, T_bool>,
  18. mp::enable_if_t<
  19. mp::is_valid_v<decltype(std::declval<T_impl>().init(std::declval<bool>()))>
  20. && mp::is_same_v<bool, mp::decay_t<T_bool>>>>
  21. {
  22. static constexpr decltype(auto) apply(T_impl& impl, bool recreate)
  23. { return impl.init(recreate); }
  24. };
  25. constexpr decltype(auto) init = mp::generic_predicate<init_builder> { };
  26. /* create_builder */
  27. template<typename X, typename = void>
  28. struct create_builder
  29. {
  30. template<typename... T_args>
  31. static constexpr decltype(auto) apply(T_args&&...)
  32. { static_assert(sizeof...(T_args) == -1, "Invalid parameters for context::create(...)!"); }
  33. };
  34. template<typename T_impl, typename T_dataset>
  35. struct create_builder<
  36. mp::list<T_impl, T_dataset>,
  37. mp::enable_if_t<
  38. mp::is_valid_v<decltype(std::declval<T_impl>().create(std::declval<T_dataset&>()))>>>
  39. {
  40. static constexpr decltype(auto) apply(T_impl& impl, T_dataset& dataset)
  41. { return impl.create(dataset); }
  42. };
  43. constexpr decltype(auto) create = mp::generic_predicate<create_builder> { };
  44. /* read_builder */
  45. template<typename X, typename = void>
  46. struct read_builder
  47. {
  48. template<typename... T_args>
  49. static constexpr decltype(auto) apply(T_args&&...)
  50. { static_assert(sizeof...(T_args) == -1, "Invalid parameters for context::read(...)!"); }
  51. };
  52. constexpr decltype(auto) read = mp::generic_predicate<read_builder> { };
  53. #if 0
  54. template<typename T_impl, typename T_dataset, typename... T_modifiers>
  55. struct create_impl<
  56. mp::list<T_impl, T_dataset, T_modifiers...>,
  57. mp::enable_if_t<mp::is_true_v<is_modifier_v<mp::decay_t<T_modifiers>>...>>>
  58. {
  59. static constexpr decltype(auto) apply(T_impl& impl, T_dataset& dataset, T_modifiers&&... modifiers)
  60. { return impl.read(dataset, make_modifiers(std::forward<T_modifiers>(modifiers)...)); }
  61. };
  62. #endif
  63. /* update_builder */
  64. template<typename X, typename = void>
  65. struct update_builder
  66. {
  67. template<typename... T_args>
  68. static constexpr decltype(auto) apply(T_args&&...)
  69. { static_assert(sizeof...(T_args) == -1, "Invalid parameters for context::update(...)!"); }
  70. };
  71. constexpr decltype(auto) update = mp::generic_predicate<update_builder> { };
  72. #if 0
  73. template<typename T_impl, typename T_dataset>
  74. struct update_impl<mp::list<T_impl, T_dataset>, void>
  75. {
  76. static constexpr decltype(auto) apply(T_impl& impl, T_dataset& dataset)
  77. { return impl.update(dataset); }
  78. };
  79. #endif
  80. /* destroy_builder */
  81. template<typename X, typename = void>
  82. struct destroy_builder
  83. {
  84. template<typename... T_args>
  85. static constexpr decltype(auto) apply(T_args&&...)
  86. { static_assert(sizeof...(T_args) == -1, "Invalid parameters for context::destroy(...)!"); }
  87. };
  88. constexpr decltype(auto) destroy = mp::generic_predicate<destroy_builder> { };
  89. #if 0
  90. template<typename T_impl, typename T_dataset>
  91. struct destroy_impl<mp::list<T_impl, T_dataset>, void>
  92. {
  93. static constexpr decltype(auto) apply(T_impl& impl, T_dataset& dataset)
  94. { return impl.create(dataset); }
  95. };
  96. #endif
  97. }
  98. /* context */
  99. template<typename T_driver, typename T_schema>
  100. template<typename... T_args>
  101. constexpr context<T_driver, T_schema>::context(const schema_type& p_schema, T_args&&... p_args)
  102. : base_type (p_schema, std::forward<T_args>(p_args)...)
  103. , _schema (p_schema)
  104. { }
  105. template<typename T_driver, typename T_schema>
  106. template<typename... T_args>
  107. constexpr decltype(auto) context<T_driver, T_schema>::init(T_args&&... args)
  108. { return __impl::init(this->impl(), std::forward<T_args>(args)...); }
  109. template<typename T_driver, typename T_schema>
  110. template<typename... T_args>
  111. constexpr decltype(auto) context<T_driver, T_schema>::create(T_args&&... args)
  112. { return __impl::create(this->impl(), std::forward<T_args>(args)...); }
  113. template<typename T_driver, typename T_schema>
  114. template<typename... T_args>
  115. constexpr decltype(auto) context<T_driver, T_schema>::read(T_args&&... args)
  116. { return __impl::read(this->impl(), std::forward<T_args>(args)...); }
  117. template<typename T_driver, typename T_schema>
  118. template<typename... T_args>
  119. constexpr decltype(auto) context<T_driver, T_schema>::update(T_args&&... args)
  120. { return __impl::update(this->impl(), std::forward<T_args>(args)...); }
  121. template<typename T_driver, typename T_schema>
  122. template<typename... T_args>
  123. constexpr decltype(auto) context<T_driver, T_schema>::destroy(T_args&&... args)
  124. { return __impl::destroy(this->impl(), std::forward<T_args>(args)...); }
  125. #if 0
  126. template<typename T_dataset, typename... T_modifiers>
  127. constexpr auto read(T_dataset& dataset, T_modifiers&&... modifiers)
  128. -> mp::enable_if<
  129. modifier::all_are_modifiers<mp::decay_t<T_modifiers>...>>
  130. {
  131. using namespace modifier;
  132. using real_dataset_type = misc::real_dataset_t<mp::decay_t<T_dataset>>;
  133. schema::tables::find(_schema.tables, hana::type_c<real_dataset_type>);
  134. this->read_impl(dataset, modifier::make_list(std::forward<T_modifiers>(modifiers)...));
  135. }
  136. template<typename T_dataset>
  137. constexpr auto read(T_dataset& dataset)
  138. -> mp::enable_if_c<
  139. !misc::is_container<mp::decay_t<T_dataset>>::value
  140. && !misc::is_nullable<mp::decay_t<T_dataset>>::value>
  141. {
  142. using namespace modifier;
  143. using real_dataset_type = misc::real_dataset_t<mp::decay_t<T_dataset>>;
  144. auto& table = schema::tables::find(_schema.tables, hana::type_c<real_dataset_type>);
  145. auto& primary_key = schema::table::get_primary_key_field(table);
  146. this->read_impl(dataset, modifier::make_list(where(equal(primary_key, primary_key.getter(dataset)))));
  147. }
  148. template<typename T_dataset>
  149. constexpr auto read(T_dataset& dataset)
  150. -> mp::enable_if_c<
  151. misc::is_container<mp::decay_t<T_dataset>>::value
  152. || misc::is_nullable<mp::decay_t<T_dataset>>::value>
  153. {
  154. using namespace modifier;
  155. using real_dataset_type = misc::real_dataset_t<mp::decay_t<T_dataset>>;
  156. schema::tables::find(_schema.tables, hana::type_c<real_dataset_type>);
  157. this->read_impl(dataset, modifier::make_list());
  158. }
  159. #endif
  160. /* make_context */
  161. template<typename T_driver, typename T_schema, typename... T_args>
  162. constexpr decltype(auto) make_context(T_schema&& schema, T_args&&... args)
  163. {
  164. using context_type = context<T_driver, T_schema>;
  165. return context_type(std::forward<T_schema>(schema), std::forward<T_args>(args)...);
  166. }
  167. /* make_context_ptr */
  168. template<typename T_driver, typename T_schema, typename... T_args>
  169. constexpr decltype(auto) make_context_ptr(T_schema&& schema, T_args&&... args)
  170. {
  171. using context_type = context<T_driver, T_schema>;
  172. using pointer_type = std::unique_ptr<context_type>;
  173. return pointer_type(new context_type(std::forward<T_schema>(schema), std::forward<T_args>(args)...));
  174. }
  175. }