| @@ -1,5 +1,6 @@ | |||||
| #pragma once | #pragma once | ||||
| #include "cpphibernate/misc.h" | #include "cpphibernate/misc.h" | ||||
| #include "cpphibernate/modifier.h" | |||||
| #include "cpphibernate/schema.h" | #include "cpphibernate/schema.h" | ||||
| #include "cpphibernate/types.h" | #include "cpphibernate/types.h" | ||||
| @@ -0,0 +1,18 @@ | |||||
| #pragma once | |||||
| #include "modifier/modifier.h" | |||||
| #include "modifier/modifiers.h" | |||||
| #include "modifier/limit.h" | |||||
| #include "modifier/offset.h" | |||||
| #include "modifier/order_by.h" | |||||
| #include "modifier/order_by/ascending.h" | |||||
| #include "modifier/order_by/descending.h" | |||||
| #include "modifier/where.h" | |||||
| #include "modifier/where/where_clause.h" | |||||
| #include "modifier/where/equal.h" | |||||
| #include "modifier/where/negation.h" | |||||
| #include "modifier/where/conjunction.h" | |||||
| #include "modifier/where/disjunction.h" | |||||
| @@ -1,39 +1,38 @@ | |||||
| #pragma once | #pragma once | ||||
| #include <cpphibernate/misc.h> | |||||
| #include <cpphibernate/config.h> | #include <cpphibernate/config.h> | ||||
| #include <cpphibernate/modifier/modifier.h> | |||||
| beg_namespace_cpphibernate_modifier | |||||
| namespace cpphibernate | |||||
| { | { | ||||
| namespace __impl | namespace __impl | ||||
| { | { | ||||
| /* limit_t */ | |||||
| template<typename T_value> | |||||
| struct limit_t | |||||
| : public modifier_t | |||||
| { | |||||
| using value_type = T_value; | |||||
| value_type value; | |||||
| }; | |||||
| /** | |||||
| * @brief Helper class to build limit objects. | |||||
| */ | |||||
| template<typename X, typename = void> | |||||
| struct limit_builder; | |||||
| } | } | ||||
| /* meta */ | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a limit modifier, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | template<typename T> | ||||
| struct is_limit_modifier | |||||
| : public mp::is_specialization_of<T, __impl::limit_t> | |||||
| { }; | |||||
| struct is_limit_modifier; | |||||
| /* make */ | |||||
| /** | |||||
| * @brief Is true if the passed type is a limit modifier, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_limit_modifier_v = is_limit_modifier<T>::value; | |||||
| template<size_t T_value> | |||||
| constexpr decltype(auto) limit = __impl::limit_t<hana::size_t<T_value>> { }; | |||||
| /** | |||||
| * @brief Predicate to create new limit objects. | |||||
| */ | |||||
| constexpr decltype(auto) limit = mp::generic_predicate<__impl::limit_builder> { }; | |||||
| } | } | ||||
| end_namespace_cpphibernate_modifier | |||||
| #include "limit.inl" | |||||
| @@ -0,0 +1,50 @@ | |||||
| #pragma once | |||||
| #include "limit.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* limit_t */ | |||||
| template<typename T_value> | |||||
| struct limit_t | |||||
| : public mp::size_t<T_value::value> | |||||
| , public tag_modifier | |||||
| , public tag_equality_comparable<tag_modifier> | |||||
| { }; | |||||
| /* limit_builder */ | |||||
| template<typename X, typename> | |||||
| struct limit_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&...) | |||||
| { static_assert(sizeof...(T_args) == -1, "Invalid parameters for limit(...)!"); } | |||||
| }; | |||||
| template<typename T> | |||||
| struct limit_builder< | |||||
| mp::list<T>, | |||||
| mp::enable_if_t< | |||||
| mp::is_valid_v<decltype(T::value)> | |||||
| && mp::is_integral_v<mp::decay_t<decltype(T::value)>>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T&&) | |||||
| { return limit_t<T> { }; } | |||||
| }; | |||||
| } | |||||
| /* is_limit_modifier */ | |||||
| template<typename T> | |||||
| struct is_limit_modifier | |||||
| : public mp::is_specialization_of<T, __impl::limit_t> | |||||
| { }; | |||||
| } | |||||
| @@ -2,30 +2,21 @@ | |||||
| #include <cpphibernate/config.h> | #include <cpphibernate/config.h> | ||||
| beg_namespace_cpphibernate_modifier | |||||
| namespace cpphibernate | |||||
| { | { | ||||
| namespace __impl | |||||
| { | |||||
| /* modifier_t */ | |||||
| struct modifier_t | |||||
| { }; | |||||
| } | |||||
| /* meta */ | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a modifier, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | template<typename T> | ||||
| struct is_modifier | |||||
| : public mp::is_base_of<__impl::modifier_t, T> | |||||
| { }; | |||||
| struct is_modifier; | |||||
| template<typename... T> | |||||
| struct all_are_modifiers | |||||
| : public mp::all_true<is_modifier<T>::value...> | |||||
| { }; | |||||
| /** | |||||
| * @brief Is true if the passed type is a modifier, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_modifier_v = is_modifier<T>::value; | |||||
| } | } | ||||
| end_namespace_cpphibernate_modifier | |||||
| #include "modifier.inl" | |||||
| @@ -0,0 +1,25 @@ | |||||
| #pragma once | |||||
| #include "modifier.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* tag_modifier */ | |||||
| struct tag_modifier | |||||
| { }; | |||||
| } | |||||
| /* is_modifier */ | |||||
| template<typename T> | |||||
| struct is_modifier | |||||
| : public mp::is_base_of<__impl::tag_modifier, T> | |||||
| { }; | |||||
| } | |||||
| @@ -1,65 +1,38 @@ | |||||
| #pragma once | #pragma once | ||||
| #include <cpphibernate/misc.h> | |||||
| #include <cpphibernate/config.h> | #include <cpphibernate/config.h> | ||||
| #include <cpphibernate/modifier/modifier.h> | |||||
| beg_namespace_cpphibernate_modifier | |||||
| { | |||||
| namespace cpphibernate { | |||||
| namespace schema { | |||||
| namespace __impl | namespace __impl | ||||
| { | { | ||||
| /* is_modifiers_impl */ | |||||
| /** | |||||
| * @brief Helper type to build modifiers. | |||||
| */ | |||||
| template<typename T, typename = void> | template<typename T, typename = void> | ||||
| struct is_modifiers_impl | |||||
| : mp::c_false_t | |||||
| { }; | |||||
| template<typename... T> | |||||
| struct is_modifiers_impl<hana::basic_tuple<T...>, mp::enable_if<all_are_modifiers<T...>>> | |||||
| : mp::c_true_t | |||||
| { }; | |||||
| struct modifiers_builder; | |||||
| } | } | ||||
| /* meta */ | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a modifiers type. | |||||
| */ | |||||
| template<typename T> | template<typename T> | ||||
| struct is_modifiers | |||||
| : public __impl::is_modifiers_impl<T> | |||||
| { }; | |||||
| /* operations */ | |||||
| namespace __impl | |||||
| { | |||||
| /* make_modifiers_impl */ | |||||
| template<typename T, typename = void> | |||||
| struct make_modifiers_impl | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&...) | |||||
| { static_assert(sizeof...(T_args) == -1, "Invalid parameters for hibernate::schema::modifier::make(...)!"); } | |||||
| }; | |||||
| struct is_modifiers; | |||||
| template<typename... T> | |||||
| struct make_modifiers_impl< | |||||
| mp::list<T...>, | |||||
| mp::enable_if_c< | |||||
| all_are_modifiers<mp::decay_t<T>...>::value>> | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { return hana::make_basic_tuple(std::forward<T_args>(args)...); } | |||||
| }; | |||||
| /** | |||||
| * @brief Is true if the passed type is an modifiers type, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr bool is_modifiers_v = is_modifiers<T>::value; | |||||
| } | |||||
| /** | |||||
| * @brief Predicate to create an modifiers object from the passed modifiers. | |||||
| */ | |||||
| constexpr decltype(auto) make_modifiers = mp::generic_predicate<__impl::modifiers_builder> { }; | |||||
| constexpr decltype(auto) make_list = misc::make_generic_predicate<__impl::make_modifiers_impl> { }; | |||||
| } } | |||||
| } | |||||
| end_namespace_cpphibernate_modifier | |||||
| #include "modifiers.inl" | |||||
| @@ -0,0 +1,63 @@ | |||||
| #pragma once | |||||
| #include "modifier.h" | |||||
| #include "modifiers.h" | |||||
| namespace cpphibernate { | |||||
| namespace schema { | |||||
| namespace __impl | |||||
| { | |||||
| /* modifiers_t */ | |||||
| template<typename... T_modifiers> | |||||
| using modifiers_t = hana::basic_tuple<T_modifiers...>; | |||||
| /* modifiers_builder */ | |||||
| template<typename T, typename> | |||||
| struct modifiers_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&...) | |||||
| { static_assert(sizeof...(T_args) == -1, "Invalid parameters for make_modifiers(...)!"); } | |||||
| }; | |||||
| template<typename... T_args> | |||||
| struct modifiers_builder< | |||||
| mp::list<T_args...>, | |||||
| mp::enable_if_t< | |||||
| mp::is_true_v<is_modifier_v<mp::decay_t<T_args>>...>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { | |||||
| using modifiers_type = modifiers_t<T_args...>; | |||||
| return modifiers_type(std::forward<T_args>(args)...); | |||||
| } | |||||
| }; | |||||
| /* is_modifiers_impl */ | |||||
| template<typename T, typename = void> | |||||
| struct is_modifiers_impl | |||||
| : mp::false_t | |||||
| { }; | |||||
| template<typename... T> | |||||
| struct is_modifiers_impl< | |||||
| modifiers_t<T...>, | |||||
| mp::enable_if_t<mp::is_true_v<is_modifier_v<mp::decay_t<T>>...>>> | |||||
| : mp::true_t | |||||
| { }; | |||||
| } | |||||
| /* is_modifiers */ | |||||
| template<typename T> | |||||
| struct is_modifiers | |||||
| : public __impl::is_modifiers_impl<T> | |||||
| { }; | |||||
| } } | |||||
| @@ -1,39 +1,38 @@ | |||||
| #pragma once | #pragma once | ||||
| #include <cpphibernate/misc.h> | |||||
| #include <cpphibernate/config.h> | #include <cpphibernate/config.h> | ||||
| #include <cpphibernate/modifier/modifier.h> | |||||
| beg_namespace_cpphibernate_modifier | |||||
| namespace cpphibernate | |||||
| { | { | ||||
| namespace __impl | namespace __impl | ||||
| { | { | ||||
| /* offset_t */ | |||||
| template<typename T_value> | |||||
| struct offset_t | |||||
| : public modifier_t | |||||
| { | |||||
| using value_type = T_value; | |||||
| value_type value; | |||||
| }; | |||||
| /** | |||||
| * @brief Helper class to build offset objects. | |||||
| */ | |||||
| template<typename X, typename = void> | |||||
| struct offset_builder; | |||||
| } | } | ||||
| /* meta */ | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a offset modifier, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | template<typename T> | ||||
| struct is_offset | |||||
| : public mp::is_specialization_of<T, __impl::offset_t> | |||||
| { }; | |||||
| struct is_offset_modifier; | |||||
| /* make */ | |||||
| /** | |||||
| * @brief Is true if the passed type is a offset modifier, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_offset_modifier_v = is_offset_modifier<T>::value; | |||||
| template<size_t T_value> | |||||
| constexpr decltype(auto) offset = __impl::offset_t<hana::size_t<T_value>> { }; | |||||
| /** | |||||
| * @brief Predicate to create new offset objects. | |||||
| */ | |||||
| constexpr decltype(auto) offset = mp::generic_predicate<__impl::offset_builder> { }; | |||||
| } | } | ||||
| end_namespace_cpphibernate_modifier | |||||
| #include "offset.inl" | |||||
| @@ -0,0 +1,50 @@ | |||||
| #pragma once | |||||
| #include "offset.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* offset_t */ | |||||
| template<typename T_value> | |||||
| struct offset_t | |||||
| : public mp::size_t<T_value::value> | |||||
| , public tag_modifier | |||||
| , public tag_equality_comparable<tag_modifier> | |||||
| { }; | |||||
| /* offset_builder */ | |||||
| template<typename X, typename> | |||||
| struct offset_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&...) | |||||
| { static_assert(sizeof...(T_args) == -1, "Invalid parameters for offset(...)!"); } | |||||
| }; | |||||
| template<typename T> | |||||
| struct offset_builder< | |||||
| mp::list<T>, | |||||
| mp::enable_if_t< | |||||
| mp::is_valid_v<decltype(T::value)> | |||||
| && mp::is_integral_v<mp::decay_t<decltype(T::value)>>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T&&) | |||||
| { return offset_t<T> { }; } | |||||
| }; | |||||
| } | |||||
| /* is_offset_modifier */ | |||||
| template<typename T> | |||||
| struct is_offset_modifier | |||||
| : public mp::is_specialization_of<T, __impl::offset_t> | |||||
| { }; | |||||
| } | |||||
| @@ -1,171 +1,38 @@ | |||||
| #pragma once | #pragma once | ||||
| #include <cpphibernate/misc.h> | |||||
| #include <cpphibernate/config.h> | #include <cpphibernate/config.h> | ||||
| #include <cpphibernate/modifier/modifier.h> | |||||
| beg_namespace_cpphibernate_modifier | |||||
| namespace cpphibernate | |||||
| { | { | ||||
| namespace __impl | namespace __impl | ||||
| { | { | ||||
| /* order_direction_tag_t */ | |||||
| struct order_direction_tag_t | |||||
| { }; | |||||
| /* order_direction_t */ | |||||
| template<typename T_field> | |||||
| struct order_direction_t | |||||
| : public order_direction_tag_t | |||||
| { | |||||
| using field_type = T_field; | |||||
| using wrapped_field_type = hana::type<mp::decay_t<field_type>>; | |||||
| wrapped_field_type wrapped_field; | |||||
| }; | |||||
| /** | |||||
| * @brief Helper class to build order_by objects. | |||||
| */ | |||||
| template<typename X, typename = void> | |||||
| struct order_by_builder; | |||||
| } | } | ||||
| /* meta */ | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a offset modifier, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | template<typename T> | ||||
| struct is_order_direction | |||||
| : public mp::is_base_of<__impl::order_direction_tag_t, T> | |||||
| { }; | |||||
| template<typename... T> | |||||
| struct all_are_order_directions | |||||
| : public mp::all_true<is_order_direction<T>::value...> | |||||
| { }; | |||||
| namespace __impl | |||||
| { | |||||
| /* order_ascending_t */ | |||||
| template<typename T_field> | |||||
| struct order_ascending_t | |||||
| : public order_direction_t<T_field> | |||||
| { }; | |||||
| /* order_descending_t */ | |||||
| template<typename T_field> | |||||
| struct order_descending_t | |||||
| : public order_direction_t<T_field> | |||||
| { }; | |||||
| /* order_by_t */ | |||||
| template<typename... T_fields> | |||||
| struct order_by_t | |||||
| : public modifier_t | |||||
| { | |||||
| using fields_type = hana::basic_tuple<T_fields...>; | |||||
| fields_type fields; | |||||
| }; | |||||
| } | |||||
| /* meta */ | |||||
| struct is_order_by_modifier; | |||||
| /** | |||||
| * @brief Is true if the passed type is a offset modifier, false otherwise. | |||||
| */ | |||||
| template<typename T> | template<typename T> | ||||
| struct is_order_by | |||||
| : public mp::is_specialization_of<T, __impl::order_by_t> | |||||
| { }; | |||||
| constexpr decltype(auto) is_order_by_modifier_v = is_order_by_modifier<T>::value; | |||||
| template<typename T> | |||||
| struct is_ascending | |||||
| : public mp::is_specialization_of<T, __impl::order_ascending_t> | |||||
| { }; | |||||
| template<typename T> | |||||
| struct is_descending | |||||
| : public mp::is_specialization_of<T, __impl::order_descending_t> | |||||
| { }; | |||||
| namespace __impl | |||||
| { | |||||
| /* ascending_builder */ | |||||
| template<typename X, typename = void> | |||||
| struct ascending_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::modifier::ascending(...)!"); } | |||||
| }; | |||||
| template<typename T_field> | |||||
| struct ascending_builder< | |||||
| mp::list<T_field>, | |||||
| mp::enable_if<schema::is_field<mp::decay_t<T_field>>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_field&&) | |||||
| { | |||||
| using field_type = mp::decay_t<T_field>; | |||||
| using ascending_type = order_ascending_t<field_type>; | |||||
| return ascending_type { }; | |||||
| } | |||||
| }; | |||||
| /* descending_builder */ | |||||
| template<typename X, typename = void> | |||||
| struct descending_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::modifier::descending(...)!"); } | |||||
| }; | |||||
| template<typename T_field> | |||||
| struct descending_builder< | |||||
| mp::list<T_field>, | |||||
| mp::enable_if<schema::is_field<mp::decay_t<T_field>>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_field&&) | |||||
| { | |||||
| using field_type = mp::decay_t<T_field>; | |||||
| using descending_type = order_descending_t<field_type>; | |||||
| return descending_type { }; | |||||
| } | |||||
| }; | |||||
| /* order_by_builder */ | |||||
| template<typename X, typename = void> | |||||
| struct order_by_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::modifier::order_by(...)!"); } | |||||
| }; | |||||
| template<typename... T_order_directions> | |||||
| struct order_by_builder< | |||||
| mp::list<T_order_directions...>, | |||||
| mp::enable_if<all_are_order_directions<mp::decay_t<T_order_directions>...>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_order_directions&&...) | |||||
| { | |||||
| using order_by_type = order_by_t<mp::decay_t<T_order_directions>...>; | |||||
| return order_by_type { }; | |||||
| } | |||||
| }; | |||||
| } | |||||
| /* make */ | |||||
| constexpr decltype(auto) ascending = misc::make_generic_predicate<__impl::ascending_builder> { }; | |||||
| constexpr decltype(auto) descending = misc::make_generic_predicate<__impl::descending_builder> { }; | |||||
| constexpr decltype(auto) order_by = misc::make_generic_predicate<__impl::order_by_builder> { }; | |||||
| /** | |||||
| * @brief Predicate to create new offset objects. | |||||
| */ | |||||
| constexpr decltype(auto) order_by = mp::generic_predicate<__impl::order_by_builder> { }; | |||||
| } | } | ||||
| end_namespace_cpphibernate_modifier | |||||
| #include "order_by.inl" | |||||
| @@ -0,0 +1,54 @@ | |||||
| #pragma once | |||||
| #include "order_by.h" | |||||
| #include "order_by/order_direction.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* order_by_t */ | |||||
| template<typename... T_order_directions> | |||||
| struct order_by_t | |||||
| : public tag_modifier | |||||
| { | |||||
| using order_directions_type = hana::basic_tuple<T_order_directions...>; | |||||
| order_directions_type order_directions; | |||||
| }; | |||||
| /* order_by_builder */ | |||||
| template<typename X, typename> | |||||
| struct order_by_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&...) | |||||
| { static_assert(sizeof...(T_args) == -1, "Invalid parameters for order_by(...)!"); } | |||||
| }; | |||||
| template<typename... T_order_directions> | |||||
| struct order_by_builder< | |||||
| mp::list<T_order_directions...>, | |||||
| mp::enable_if_t<mp::is_true_v<is_order_direction_v<mp::decay_t<T_order_directions>>...>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_order_directions&&...) | |||||
| { | |||||
| using order_by_type = order_by_t<mp::decay_t<T_order_directions>...>; | |||||
| return order_by_type { }; | |||||
| } | |||||
| }; | |||||
| } | |||||
| /* is_order_by_modifier */ | |||||
| template<typename T> | |||||
| struct is_order_by_modifier | |||||
| : public mp::is_specialization_of<T, __impl::order_by_t> | |||||
| { }; | |||||
| } | |||||
| @@ -0,0 +1,38 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /** | |||||
| * @brief Helper class to build ascending objects. | |||||
| */ | |||||
| template<typename X, typename = void> | |||||
| struct ascending_builder; | |||||
| } | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a ascending order, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| struct is_ascending; | |||||
| /** | |||||
| * @brief Is true if the passed type is a ascending order, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_ascending_v = is_ascending<T>::value; | |||||
| /** | |||||
| * @brief Predicate to create new ascending order objects. | |||||
| */ | |||||
| constexpr decltype(auto) ascending = mp::generic_predicate<__impl::ascending_builder> { }; | |||||
| } | |||||
| #include "ascending.inl" | |||||
| @@ -0,0 +1,49 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/schema/field.h> | |||||
| #include "ascending.h" | |||||
| #include "order_direction.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* ascending_t */ | |||||
| template<typename T_field> | |||||
| struct ascending_t | |||||
| : public order_direction_t<T_field> | |||||
| { }; | |||||
| /* ascending_builder */ | |||||
| template<typename X, typename> | |||||
| struct ascending_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::ascending(...)!"); } | |||||
| }; | |||||
| template<typename T_field> | |||||
| struct ascending_builder< | |||||
| mp::list<T_field>, | |||||
| mp::enable_if_t<schema::is_field_v<mp::decay_t<T_field>>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_field&&) | |||||
| { return ascending_t<T_field> { }; } | |||||
| }; | |||||
| } | |||||
| /* is_ascending */ | |||||
| template<typename T> | |||||
| struct is_ascending | |||||
| : public mp::is_specialization_of<T, __impl::ascending_t> | |||||
| { }; | |||||
| } | |||||
| @@ -0,0 +1,38 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /** | |||||
| * @brief Helper class to build descending objects. | |||||
| */ | |||||
| template<typename X, typename = void> | |||||
| struct descending_builder; | |||||
| } | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a descending order, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| struct is_descending; | |||||
| /** | |||||
| * @brief Is true if the passed type is a descending order, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_descending_v = is_descending<T>::value; | |||||
| /** | |||||
| * @brief Predicate to create new descending order objects. | |||||
| */ | |||||
| constexpr decltype(auto) descending = mp::generic_predicate<__impl::descending_builder> { }; | |||||
| } | |||||
| #include "descending.inl" | |||||
| @@ -0,0 +1,47 @@ | |||||
| #pragma once | |||||
| #include "descending.h" | |||||
| #include "order_direction.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* descending_t */ | |||||
| template<typename T_field> | |||||
| struct descending_t | |||||
| : public order_direction_t<T_field> | |||||
| { }; | |||||
| /* descending_builder */ | |||||
| template<typename X, typename> | |||||
| struct descending_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::descending(...)!"); } | |||||
| }; | |||||
| template<typename T_field> | |||||
| struct descending_builder< | |||||
| mp::list<T_field>, | |||||
| mp::enable_if_t<schema::is_field_v<mp::decay_t<T_field>>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_field&&) | |||||
| { return descending_t<T_field> { }; } | |||||
| }; | |||||
| } | |||||
| /* is_descending */ | |||||
| template<typename T> | |||||
| struct is_descending | |||||
| : public mp::is_specialization_of<T, __impl::descending_t> | |||||
| { }; | |||||
| } | |||||
| @@ -0,0 +1,22 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| namespace cpphibernate | |||||
| { | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a order_direction, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| struct is_order_direction; | |||||
| /** | |||||
| * @brief Is true if the passed type is a order_direction, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_order_direction_v = is_order_direction<T>::value; | |||||
| } | |||||
| #include "order_direction.inl" | |||||
| @@ -0,0 +1,37 @@ | |||||
| #pragma once | |||||
| #include "order_direction.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* tag_order_direction */ | |||||
| struct tag_order_direction | |||||
| { }; | |||||
| /* order_direction_t */ | |||||
| template<typename T_field> | |||||
| struct order_direction_t | |||||
| : public tag_order_direction | |||||
| { | |||||
| using field_type = T_field; | |||||
| using wrapped_field_type = hana::type<mp::decay_t<field_type>>; | |||||
| wrapped_field_type wrapped_field; | |||||
| }; | |||||
| } | |||||
| /* is_order_direction */ | |||||
| template<typename T> | |||||
| struct is_order_direction | |||||
| : public mp::is_base_of<__impl::tag_order_direction, T> | |||||
| { }; | |||||
| } | |||||
| @@ -1,4 +1,38 @@ | |||||
| #pragma once | #pragma once | ||||
| #include <cpphibernate/modifier/where/clauses.h> | |||||
| #include <cpphibernate/modifier/where/where.h> | |||||
| #include <cpphibernate/config.h> | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /** | |||||
| * @brief Helper class to build where objects. | |||||
| */ | |||||
| template<typename X, typename = void> | |||||
| struct where_builder; | |||||
| } | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a where modifier, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| struct is_where_modifier; | |||||
| /** | |||||
| * @brief Is true if the passed type is a where modifier, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_where_modifier_v = is_where_modifier<T>::value; | |||||
| /** | |||||
| * @brief Predicate to create new where objects. | |||||
| */ | |||||
| constexpr decltype(auto) where = mp::generic_predicate<__impl::where_builder> { }; | |||||
| } | |||||
| #include "where.inl" | |||||
| @@ -0,0 +1,59 @@ | |||||
| #pragma once | |||||
| #include "where.h" | |||||
| #include "where/where_clause.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* where_t */ | |||||
| template<typename T_where_clause> | |||||
| struct where_t | |||||
| : public tag_modifier | |||||
| { | |||||
| using clause_type = T_where_clause; | |||||
| clause_type clause; | |||||
| constexpr where_t(clause_type&& p_clause) | |||||
| : clause(p_clause) | |||||
| { } | |||||
| }; | |||||
| /* where_builder */ | |||||
| template<typename X, typename> | |||||
| struct where_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&...) | |||||
| { static_assert(sizeof...(T_args) == -1, "Invalid parameters for where(...)!"); } | |||||
| }; | |||||
| template<typename T_where_clause> | |||||
| struct where_builder< | |||||
| mp::list<T_where_clause>, | |||||
| mp::enable_if_t<mp::is_true_v<is_where_clause_v<mp::decay_t<T_where_clause>>>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_where_clause&& clause) | |||||
| { | |||||
| using clause_type = T_where_clause; | |||||
| using where_type = where_t<clause_type>; | |||||
| return where_type(std::forward<clause_type>(clause)); | |||||
| } | |||||
| }; | |||||
| } | |||||
| /* is_where_modifier */ | |||||
| template<typename T> | |||||
| struct is_where_modifier | |||||
| : public mp::is_specialization_of<T, __impl::where_t> | |||||
| { }; | |||||
| } | |||||
| @@ -1,7 +0,0 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/modifier/where/clauses/and.h> | |||||
| #include <cpphibernate/modifier/where/clauses/clause.h> | |||||
| #include <cpphibernate/modifier/where/clauses/equal.h> | |||||
| #include <cpphibernate/modifier/where/clauses/not.h> | |||||
| #include <cpphibernate/modifier/where/clauses/or.h> | |||||
| @@ -1,60 +0,0 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| #include <cpphibernate/modifier/where/clauses/clause.h> | |||||
| beg_namespace_cpphibernate_modifier | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* where_clause_and_t */ | |||||
| template<typename... T_clauses> | |||||
| struct where_clause_and_t | |||||
| : public where_clause_t | |||||
| { | |||||
| using clauses_type = hana::tuple<T_clauses...>; | |||||
| clauses_type clauses; | |||||
| constexpr where_clause_and_t(T_clauses&&... p_clauses) | |||||
| : clauses(std::forward<T_clauses>(p_clauses)...) | |||||
| { } | |||||
| }; | |||||
| /* where_clause_and_builder */ | |||||
| template<typename X, typename = void> | |||||
| struct where_clause_and_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::modifier::and(...)!"); } | |||||
| }; | |||||
| template<typename... T_clauses> | |||||
| struct where_clause_and_builder< | |||||
| mp::list<T_clauses...>, | |||||
| mp::enable_if<all_are_where_clauses<mp::decay_t<T_clauses>...>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_clauses&&... clauses) | |||||
| { return where_clause_and_t<T_clauses...>(std::forward<T_clauses>(clauses)...); } | |||||
| }; | |||||
| } | |||||
| /* meta */ | |||||
| template<typename T> | |||||
| struct is_where_clause_and | |||||
| : public mp::is_specialization_of<T, __impl::where_clause_and_t> | |||||
| { }; | |||||
| /* make */ | |||||
| constexpr decltype(auto) and_ = misc::make_generic_predicate<__impl::where_clause_and_builder> { }; | |||||
| } | |||||
| end_namespace_cpphibernate_modifier | |||||
| @@ -1,31 +0,0 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| beg_namespace_cpphibernate_modifier | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* where_clause_t */ | |||||
| struct where_clause_t | |||||
| { }; | |||||
| } | |||||
| /* meta */ | |||||
| template<typename T> | |||||
| struct is_where_clause | |||||
| : public mp::is_base_of<__impl::where_clause_t, T> | |||||
| { }; | |||||
| template<typename... T> | |||||
| struct all_are_where_clauses | |||||
| : public mp::all_true<is_where_clause<T>::value...> | |||||
| { }; | |||||
| } | |||||
| end_namespace_cpphibernate_modifier | |||||
| @@ -1,64 +0,0 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| #include <cpphibernate/schema/field.h> | |||||
| #include <cpphibernate/modifier/where/clauses/clause.h> | |||||
| beg_namespace_cpphibernate_modifier | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* where_clause_equal_t */ | |||||
| template<typename T_field, typename T_value> | |||||
| struct where_clause_equal_t | |||||
| : public where_clause_t | |||||
| { | |||||
| using field_type = T_field; | |||||
| using value_type = T_value; | |||||
| field_type field; | |||||
| value_type value; | |||||
| constexpr where_clause_equal_t(T_field&& p_field, T_value&& p_value) | |||||
| : field(std::forward<T_field>(p_field)) | |||||
| , value(std::forward<T_value>(p_value)) | |||||
| { } | |||||
| }; | |||||
| /* where_clause_equal_builder */ | |||||
| template<typename X, typename = void> | |||||
| struct where_clause_equal_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::modifier::equal(...)!"); } | |||||
| }; | |||||
| template<typename T_field, typename T_value> | |||||
| struct where_clause_equal_builder< | |||||
| mp::list<T_field, T_value>, | |||||
| mp::enable_if<schema::is_field<mp::decay_t<T_field>>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_field&& field, T_value&& value) | |||||
| { return where_clause_equal_t<T_field, T_value>(std::forward<T_field>(field), std::forward<T_value>(value)); } | |||||
| }; | |||||
| } | |||||
| /* meta */ | |||||
| template<typename T> | |||||
| struct is_where_clause_equal | |||||
| : public mp::is_specialization_of<T, __impl::where_clause_equal_t> | |||||
| { }; | |||||
| /* make */ | |||||
| constexpr decltype(auto) equal = misc::make_generic_predicate<__impl::where_clause_equal_builder> { }; | |||||
| } | |||||
| end_namespace_cpphibernate_modifier | |||||
| @@ -1,60 +0,0 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| #include <cpphibernate/modifier/where/clauses/clause.h> | |||||
| beg_namespace_cpphibernate_modifier | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* where_clause_not_t */ | |||||
| template<typename T_clause> | |||||
| struct where_clause_not_t | |||||
| : public where_clause_t | |||||
| { | |||||
| using clause_type = T_clause; | |||||
| clause_type clause; | |||||
| constexpr where_clause_not_t(T_clause&& p_clause) | |||||
| : clause(std::forward<T_clause>(p_clause)) | |||||
| { } | |||||
| }; | |||||
| /* where_clause_not_builder */ | |||||
| template<typename X, typename = void> | |||||
| struct where_clause_not_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::modifier::not(...)!"); } | |||||
| }; | |||||
| template<typename T_clause> | |||||
| struct where_clause_not_builder< | |||||
| mp::list<T_clause>, | |||||
| mp::enable_if<is_where_clause<mp::decay_t<T_clause>>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_clause&& clause) | |||||
| { return where_clause_not_t<T_clause>(std::forward<T_clause>(clause)); } | |||||
| }; | |||||
| } | |||||
| /* meta */ | |||||
| template<typename T> | |||||
| struct is_where_clause_not | |||||
| : public mp::is_specialization_of<T, __impl::where_clause_not_t> | |||||
| { }; | |||||
| /* make */ | |||||
| constexpr decltype(auto) not_ = misc::make_generic_predicate<__impl::where_clause_not_builder> { }; | |||||
| } | |||||
| end_namespace_cpphibernate_modifier | |||||
| @@ -1,60 +0,0 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| #include <cpphibernate/modifier/where/clauses/clause.h> | |||||
| beg_namespace_cpphibernate_modifier | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* where_clause_or_t */ | |||||
| template<typename... T_clauses> | |||||
| struct where_clause_or_t | |||||
| : public where_clause_t | |||||
| { | |||||
| using clauses_type = hana::tuple<T_clauses...>; | |||||
| clauses_type clauses; | |||||
| constexpr where_clause_or_t(T_clauses&&... p_clauses) | |||||
| : clauses(std::forward<T_clauses>(p_clauses)...) | |||||
| { } | |||||
| }; | |||||
| /* where_clause_or_builder */ | |||||
| template<typename X, typename = void> | |||||
| struct where_clause_or_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::modifier::or(...)!"); } | |||||
| }; | |||||
| template<typename... T_clauses> | |||||
| struct where_clause_or_builder< | |||||
| mp::list<T_clauses...>, | |||||
| mp::enable_if<all_are_where_clauses<mp::decay_t<T_clauses>...>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_clauses&&... clauses) | |||||
| { return where_clause_or_t<T_clauses...>(std::forward<T_clauses>(clauses)...); } | |||||
| }; | |||||
| } | |||||
| /* meta */ | |||||
| template<typename T> | |||||
| struct is_where_clause_or | |||||
| : public mp::is_specialization_of<T, __impl::where_clause_or_t> | |||||
| { }; | |||||
| /* make */ | |||||
| constexpr decltype(auto) or_ = misc::make_generic_predicate<__impl::where_clause_or_builder> { }; | |||||
| } | |||||
| end_namespace_cpphibernate_modifier | |||||
| @@ -0,0 +1,59 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /** | |||||
| * @brief Helper class to build conjunction objects. | |||||
| */ | |||||
| template<typename X, typename = void> | |||||
| struct conjunction_builder; | |||||
| } | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a conjunction clause, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| struct is_conjunction; | |||||
| /** | |||||
| * @brief Is true if the passed type is a conjunction clause, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_conjunction_v = is_conjunction<T>::value; | |||||
| /** | |||||
| * @brief Predicate to create new conjunction clause objects. | |||||
| */ | |||||
| constexpr decltype(auto) conjunction = mp::generic_predicate<__impl::conjunction_builder> { }; | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a conjunction clause, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| struct is_and; | |||||
| /** | |||||
| * @brief Is true if the passed type is a conjunction clause, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_and_v = is_and<T>::value; | |||||
| /** | |||||
| * @brief Predicate to create new conjunction clause objects. | |||||
| */ | |||||
| constexpr decltype(auto) and_ = mp::generic_predicate<__impl::conjunction_builder> { }; | |||||
| } | |||||
| #include "conjunction.inl" | |||||
| @@ -0,0 +1,69 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/schema/field.h> | |||||
| #include "conjunction.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* where_clause_conjunction_t */ | |||||
| template<typename... T_clauses> | |||||
| struct where_clause_conjunction_t | |||||
| : public tag_where_clause | |||||
| { | |||||
| using clauses_type = hana::basic_tuple<T_clauses...>; | |||||
| clauses_type clauses; | |||||
| constexpr where_clause_conjunction_t( | |||||
| T_clauses&&... p_clauses) | |||||
| : clauses(std::forward<T_clauses>(p_clauses)...) | |||||
| { } | |||||
| }; | |||||
| /* conjunction_builder */ | |||||
| template<typename X, typename> | |||||
| struct conjunction_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::conjunction(...)!"); } | |||||
| }; | |||||
| template<typename... T_clauses> | |||||
| struct conjunction_builder< | |||||
| mp::list<T_clauses...>, | |||||
| mp::enable_if_t< | |||||
| mp::is_true_v<is_where_clause_v<mp::decay_t<T_clauses>>...> | |||||
| && sizeof...(T_clauses) >= 2>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_clauses&&... clauses) | |||||
| { | |||||
| using clause_type = where_clause_conjunction_t<T_clauses...>; | |||||
| return clause_type(std::forward<T_clauses>(clauses)...); | |||||
| } | |||||
| }; | |||||
| } | |||||
| /* is_conjunction */ | |||||
| template<typename T> | |||||
| struct is_conjunction | |||||
| : public mp::is_specialization_of<T, __impl::where_clause_conjunction_t> | |||||
| { }; | |||||
| /* is_and */ | |||||
| template<typename T> | |||||
| struct is_and | |||||
| : public mp::is_specialization_of<T, __impl::where_clause_conjunction_t> | |||||
| { }; | |||||
| } | |||||
| @@ -0,0 +1,59 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /** | |||||
| * @brief Helper class to build disjunction objects. | |||||
| */ | |||||
| template<typename X, typename = void> | |||||
| struct disjunction_builder; | |||||
| } | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a disjunction clause, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| struct is_disjunction; | |||||
| /** | |||||
| * @brief Is true if the passed type is a disjunction clause, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_disjunction_v = is_disjunction<T>::value; | |||||
| /** | |||||
| * @brief Predicate to create new disjunction clause objects. | |||||
| */ | |||||
| constexpr decltype(auto) disjunction = mp::generic_predicate<__impl::disjunction_builder> { }; | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a disjunction clause, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| struct is_or; | |||||
| /** | |||||
| * @brief Is true if the passed type is a disjunction clause, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_or_v = is_or<T>::value; | |||||
| /** | |||||
| * @brief Predicate to create new disjunction clause objects. | |||||
| */ | |||||
| constexpr decltype(auto) or_ = mp::generic_predicate<__impl::disjunction_builder> { }; | |||||
| } | |||||
| #include "disjunction.inl" | |||||
| @@ -0,0 +1,69 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/schema/field.h> | |||||
| #include "disjunction.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* where_clause_disjunction_t */ | |||||
| template<typename... T_clauses> | |||||
| struct where_clause_disjunction_t | |||||
| : public tag_where_clause | |||||
| { | |||||
| using clauses_type = hana::basic_tuple<T_clauses...>; | |||||
| clauses_type clauses; | |||||
| constexpr where_clause_disjunction_t( | |||||
| T_clauses&&... p_clauses) | |||||
| : clauses(std::forward<T_clauses>(p_clauses)...) | |||||
| { } | |||||
| }; | |||||
| /* disjunction_builder */ | |||||
| template<typename X, typename> | |||||
| struct disjunction_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::disjunction(...)!"); } | |||||
| }; | |||||
| template<typename... T_clauses> | |||||
| struct disjunction_builder< | |||||
| mp::list<T_clauses...>, | |||||
| mp::enable_if_t< | |||||
| mp::is_true_v<is_where_clause_v<mp::decay_t<T_clauses>>...> | |||||
| && sizeof...(T_clauses) >= 2>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_clauses&&... clauses) | |||||
| { | |||||
| using clause_type = where_clause_disjunction_t<T_clauses...>; | |||||
| return clause_type(std::forward<T_clauses>(clauses)...); | |||||
| } | |||||
| }; | |||||
| } | |||||
| /* is_disjunction */ | |||||
| template<typename T> | |||||
| struct is_disjunction | |||||
| : public mp::is_specialization_of<T, __impl::where_clause_disjunction_t> | |||||
| { }; | |||||
| /* is_or */ | |||||
| template<typename T> | |||||
| struct is_or | |||||
| : public mp::is_specialization_of<T, __impl::where_clause_disjunction_t> | |||||
| { }; | |||||
| } | |||||
| @@ -0,0 +1,38 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /** | |||||
| * @brief Helper class to build equal objects. | |||||
| */ | |||||
| template<typename X, typename = void> | |||||
| struct equal_builder; | |||||
| } | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a equal order, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| struct is_equal; | |||||
| /** | |||||
| * @brief Is true if the passed type is a equal order, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_equal_v = is_equal<T>::value; | |||||
| /** | |||||
| * @brief Predicate to create new equal order objects. | |||||
| */ | |||||
| constexpr decltype(auto) equal = mp::generic_predicate<__impl::equal_builder> { }; | |||||
| } | |||||
| #include "equal.inl" | |||||
| @@ -0,0 +1,64 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/schema/field.h> | |||||
| #include "equal.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* where_clause_equal_t */ | |||||
| template<typename T_field, typename T_value> | |||||
| struct where_clause_equal_t | |||||
| : public tag_where_clause | |||||
| { | |||||
| using field_type = T_field; | |||||
| using value_type = T_value; | |||||
| field_type field; | |||||
| value_type value; | |||||
| constexpr where_clause_equal_t( | |||||
| field_type&& p_field, | |||||
| value_type&& p_value) | |||||
| : field(std::forward<field_type>(p_field)) | |||||
| , value(std::forward<value_type>(p_value)) | |||||
| { } | |||||
| }; | |||||
| /* equal_builder */ | |||||
| template<typename X, typename> | |||||
| struct equal_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::equal(...)!"); } | |||||
| }; | |||||
| template<typename T_field, typename T_value> | |||||
| struct equal_builder< | |||||
| mp::list<T_field, T_value>, | |||||
| mp::enable_if_t<schema::is_field_v<mp::decay_t<T_field>>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_field&& field, T_value&& value) | |||||
| { | |||||
| using clause_type = where_clause_equal_t<T_field, T_value>; | |||||
| return clause_type(std::forward<T_field>(field), std::forward<T_value>(value)); | |||||
| } | |||||
| }; | |||||
| } | |||||
| /* is_equal */ | |||||
| template<typename T> | |||||
| struct is_equal | |||||
| : public mp::is_specialization_of<T, __impl::where_clause_equal_t> | |||||
| { }; | |||||
| } | |||||
| @@ -0,0 +1,59 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /** | |||||
| * @brief Helper class to build negation objects. | |||||
| */ | |||||
| template<typename X, typename = void> | |||||
| struct negation_builder; | |||||
| } | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a negation clause, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| struct is_negation; | |||||
| /** | |||||
| * @brief Is true if the passed type is a negation clause, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_negation_v = is_negation<T>::value; | |||||
| /** | |||||
| * @brief Predicate to create new negation clause objects. | |||||
| */ | |||||
| constexpr decltype(auto) negation = mp::generic_predicate<__impl::negation_builder> { }; | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a negation clause, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| struct is_not; | |||||
| /** | |||||
| * @brief Is true if the passed type is a negation clause, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_not_v = is_not<T>::value; | |||||
| /** | |||||
| * @brief Predicate to create new negation clause objects. | |||||
| */ | |||||
| constexpr decltype(auto) not_ = mp::generic_predicate<__impl::negation_builder> { }; | |||||
| } | |||||
| #include "negation.inl" | |||||
| @@ -0,0 +1,67 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/schema/field.h> | |||||
| #include "negation.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* where_clause_negation_t */ | |||||
| template<typename T_clause> | |||||
| struct where_clause_negation_t | |||||
| : public tag_where_clause | |||||
| { | |||||
| using clause_type = T_clause; | |||||
| clause_type clause; | |||||
| constexpr where_clause_negation_t( | |||||
| clause_type&& p_clause) | |||||
| : clause(std::forward<clause_type>(p_clause)) | |||||
| { } | |||||
| }; | |||||
| /* negation_builder */ | |||||
| template<typename X, typename> | |||||
| struct negation_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::negation(...)!"); } | |||||
| }; | |||||
| template<typename T_clause> | |||||
| struct negation_builder< | |||||
| mp::list<T_clause>, | |||||
| mp::enable_if_t<is_where_clause_v<mp::decay_t<T_clause>>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_clause&& clause) | |||||
| { | |||||
| using clause_type = where_clause_negation_t<T_clause>; | |||||
| return clause_type(std::forward<T_clause>(clause)); | |||||
| } | |||||
| }; | |||||
| } | |||||
| /* is_negation */ | |||||
| template<typename T> | |||||
| struct is_negation | |||||
| : public mp::is_specialization_of<T, __impl::where_clause_negation_t> | |||||
| { }; | |||||
| /* is_not */ | |||||
| template<typename T> | |||||
| struct is_not | |||||
| : public mp::is_specialization_of<T, __impl::where_clause_negation_t> | |||||
| { }; | |||||
| } | |||||
| @@ -1,60 +0,0 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/misc.h> | |||||
| #include <cpphibernate/config.h> | |||||
| #include <cpphibernate/modifier/modifier.h> | |||||
| #include <cpphibernate/modifier/where/clauses/clause.h> | |||||
| beg_namespace_cpphibernate_modifier | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* where_t */ | |||||
| template<typename T_clause> | |||||
| struct where_t | |||||
| : public modifier_t | |||||
| { | |||||
| using clause_type = T_clause; | |||||
| clause_type clause; | |||||
| constexpr where_t(T_clause&& p_clause) | |||||
| : clause(std::forward<T_clause>(p_clause)) | |||||
| { } | |||||
| }; | |||||
| /* where_builder */ | |||||
| template<typename X, typename = void> | |||||
| struct where_builder | |||||
| { | |||||
| template<typename... T_args> | |||||
| static constexpr decltype(auto) apply(T_args&&... args) | |||||
| { static_assert(sizeof...(args) == -1, "Invalid parameters for hibernate::modifier::where(...)!"); } | |||||
| }; | |||||
| template<typename T_clause> | |||||
| struct where_builder<mp::list<T_clause>, mp::enable_if<is_where_clause<T_clause>>> | |||||
| { | |||||
| static constexpr decltype(auto) apply(T_clause&& clause) | |||||
| { return where_t<T_clause>(std::forward<T_clause>(clause)); } | |||||
| }; | |||||
| } | |||||
| /* meta */ | |||||
| template<typename T> | |||||
| struct is_where | |||||
| : public mp::is_specialization_of<T, __impl::where_t> | |||||
| { }; | |||||
| /* make */ | |||||
| constexpr decltype(auto) where = misc::make_generic_predicate<__impl::where_builder> { }; | |||||
| } | |||||
| end_namespace_cpphibernate_modifier | |||||
| @@ -0,0 +1,22 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate/config.h> | |||||
| namespace cpphibernate | |||||
| { | |||||
| /** | |||||
| * @brief Evaluates to true_t if the passed type is a where_clause, false_t otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| struct is_where_clause; | |||||
| /** | |||||
| * @brief Is true if the passed type is a where_clause, false otherwise. | |||||
| */ | |||||
| template<typename T> | |||||
| constexpr decltype(auto) is_where_clause_v = is_where_clause<T>::value; | |||||
| } | |||||
| #include "where_clause.inl" | |||||
| @@ -0,0 +1,25 @@ | |||||
| #pragma once | |||||
| #include "where_clause.h" | |||||
| namespace cpphibernate | |||||
| { | |||||
| namespace __impl | |||||
| { | |||||
| /* tag_where_clause */ | |||||
| struct tag_where_clause | |||||
| { }; | |||||
| } | |||||
| /* is_where_clause */ | |||||
| template<typename T> | |||||
| struct is_where_clause | |||||
| : public mp::is_base_of<__impl::tag_where_clause, T> | |||||
| { }; | |||||
| } | |||||
| @@ -11,7 +11,7 @@ namespace schema { | |||||
| /* attributes_t */ | /* attributes_t */ | ||||
| template<typename... T_attributes> | template<typename... T_attributes> | ||||
| using attributes_t = hana::basic_tuple<T_attributes...>; | |||||
| using attributes_t = hana::tuple<T_attributes...>; | |||||
| /* attributes_builder */ | /* attributes_builder */ | ||||
| @@ -11,7 +11,7 @@ namespace schema { | |||||
| /* fields_t */ | /* fields_t */ | ||||
| template<typename... T_fields> | template<typename... T_fields> | ||||
| using fields_t = hana::basic_tuple<T_fields...>; | |||||
| using fields_t = hana::tuple<T_fields...>; | |||||
| /* fields_builder */ | /* fields_builder */ | ||||
| @@ -11,7 +11,7 @@ namespace schema { | |||||
| /* tables_t */ | /* tables_t */ | ||||
| template<typename... T_tables> | template<typename... T_tables> | ||||
| using tables_t = hana::basic_tuple<T_tables...>; | |||||
| using tables_t = hana::tuple<T_tables...>; | |||||
| /* tables_builder */ | /* tables_builder */ | ||||
| @@ -4,17 +4,26 @@ | |||||
| #include "test_schema.h" | #include "test_schema.h" | ||||
| constexpr decltype(auto) x = ::cpphibernate::mp::make_getter( | |||||
| [](std::string&) { | |||||
| return int { }; | |||||
| }); | |||||
| using namespace ::testing; | using namespace ::testing; | ||||
| using namespace ::cpphibernate; | using namespace ::cpphibernate; | ||||
| using namespace ::cpphibernate::schema; | using namespace ::cpphibernate::schema; | ||||
| TEST(cpphibernate, getHelloWorld) | |||||
| using namespace hana::literals; | |||||
| constexpr decltype(auto) tmp_table = test_schema.tables[0_c]; | |||||
| constexpr decltype(auto) tmp_field = tmp_table.fields[0_c]; | |||||
| constexpr decltype(auto) mod = make_modifiers( | |||||
| limit(5_c), | |||||
| offset(3_c), | |||||
| order_by( | |||||
| ascending(tmp_field), | |||||
| descending(tmp_field)), | |||||
| where( | |||||
| or_( | |||||
| negation(equal(tmp_field, 1)), | |||||
| negation(equal(tmp_field, 1))))); | |||||
| TEST(cpphibernate_tests, dummy) | |||||
| { | { | ||||
| (void)x; | |||||
| // std::cout << test_schema << std::endl; | |||||
| (void)mod; | |||||
| } | } | ||||
| @@ -1,236 +0,0 @@ | |||||
| #pragma once | |||||
| #include <cpphibernate.h> | |||||
| #include <cpputils/misc/enum.h> | |||||
| enum class test_enum | |||||
| { | |||||
| test0, | |||||
| test1, | |||||
| test2, | |||||
| test3, | |||||
| first = test0, | |||||
| last = test3, | |||||
| }; | |||||
| DEFINE_ENUM_TO_STRING_MAP( | |||||
| test_enum, | |||||
| { test_enum::test0, "test0" }, | |||||
| { test_enum::test1, "test1" }, | |||||
| { test_enum::test2, "test2" }, | |||||
| { test_enum::test3, "test3" } | |||||
| ); | |||||
| DEFINE_STRING_TO_ENUM_MAP( | |||||
| test_enum, | |||||
| invariant_string_less, | |||||
| { "test0", test_enum::test0 }, | |||||
| { "test1", test_enum::test1 }, | |||||
| { "test2", test_enum::test2 }, | |||||
| { "test3", test_enum::test3 } | |||||
| ); | |||||
| struct test1 | |||||
| { | |||||
| ::cpphibernate::uuid id; | |||||
| std::string str_data; | |||||
| ::cpphibernate::string<64> str64_data; | |||||
| utl::nullable<uint32_t> u32_nullable; | |||||
| std::unique_ptr<uint32_t> u32_ptr_u; | |||||
| std::shared_ptr<uint32_t> u32_ptr_s; | |||||
| }; | |||||
| struct test2 | |||||
| { | |||||
| ::cpphibernate::uuid id; | |||||
| uint8_t u8_data; | |||||
| int8_t i8_data; | |||||
| uint16_t u16_data; | |||||
| int16_t i16_data; | |||||
| }; | |||||
| struct test3 | |||||
| { | |||||
| ::cpphibernate::uuid id; | |||||
| uint32_t u32_data; | |||||
| int32_t i32_data; | |||||
| uint64_t u64_data; | |||||
| int64_t i64_data; | |||||
| }; | |||||
| struct base | |||||
| { | |||||
| ::cpphibernate::uuid id; | |||||
| std::string name; | |||||
| virtual ~base() = default; | |||||
| }; | |||||
| struct derived1 | |||||
| : public base | |||||
| { | |||||
| ::cpphibernate::uuid derived1_id; | |||||
| test1 test1_data; | |||||
| test_enum enum_data; | |||||
| }; | |||||
| struct derived2 | |||||
| : public base | |||||
| { | |||||
| ::cpphibernate::uuid derived2_id; | |||||
| utl::nullable<test2> test2_nullable; | |||||
| std::unique_ptr<test2> test2_ptr_u; | |||||
| std::shared_ptr<test2> test2_ptr_s; | |||||
| }; | |||||
| struct derived3 | |||||
| : public derived2 | |||||
| { | |||||
| ::cpphibernate::uuid derived3_id; | |||||
| std::list<test3> test3_list; | |||||
| std::vector<test3> test3_vector; | |||||
| }; | |||||
| struct dummy_id | |||||
| { | |||||
| int data; | |||||
| inline dummy_id(int p_data = 0) | |||||
| : data(p_data) | |||||
| { } | |||||
| }; | |||||
| struct dummy_owner | |||||
| { | |||||
| ::cpphibernate::uuid id; | |||||
| std::vector<dummy_id> dummies; | |||||
| }; | |||||
| struct double_usage_item | |||||
| { | |||||
| unsigned int id { 0 }; | |||||
| int data { 0 }; | |||||
| double_usage_item(int p_data = 0) | |||||
| : data(p_data) | |||||
| { } | |||||
| }; | |||||
| struct double_usage | |||||
| { | |||||
| int id { 0 }; | |||||
| std::unique_ptr<double_usage_item> single_item; | |||||
| std::vector<double_usage_item> multiple_items; | |||||
| }; | |||||
| struct double_usage_wrapper | |||||
| { | |||||
| int id { 0 }; | |||||
| std::unique_ptr<double_usage> double_usage; | |||||
| }; | |||||
| constexpr decltype(auto) test_schema = cpphibernate_make_schema( | |||||
| test, | |||||
| cpphibernate_make_table_name( | |||||
| tbl_test1, | |||||
| test1, | |||||
| 1, | |||||
| cpphibernate_make_id (&test1::id), | |||||
| cpphibernate_make_field (test1, str_data), | |||||
| cpphibernate_make_field (test1, str64_data), | |||||
| cpphibernate_make_field (test1, u32_nullable), | |||||
| cpphibernate_make_field (test1, u32_ptr_u), | |||||
| cpphibernate_make_field (test1, u32_ptr_s) | |||||
| ), | |||||
| cpphibernate_make_table_name( | |||||
| tbl_test2, | |||||
| test2, | |||||
| 2, | |||||
| cpphibernate_make_id (&test2::id), | |||||
| cpphibernate_make_field (test2, u8_data), | |||||
| cpphibernate_make_field (test2, i8_data), | |||||
| cpphibernate_make_field (test2, u16_data), | |||||
| cpphibernate_make_field (test2, i16_data) | |||||
| ), | |||||
| cpphibernate_make_table_name( | |||||
| tbl_test3, | |||||
| test3, | |||||
| 3, | |||||
| cpphibernate_make_id (&test3::id), | |||||
| cpphibernate_make_field (test3, u32_data), | |||||
| cpphibernate_make_field (test3, i32_data), | |||||
| cpphibernate_make_field (test3, u64_data), | |||||
| cpphibernate_make_field (test3, i64_data) | |||||
| ), | |||||
| cpphibernate_make_table_name( | |||||
| tbl_base, | |||||
| base, | |||||
| 10, | |||||
| cpphibernate_make_id (&base::id), | |||||
| cpphibernate_make_field (base, name) | |||||
| ), | |||||
| cpphibernate_make_table_name( | |||||
| tbl_derived1, | |||||
| derived1, | |||||
| 11, | |||||
| cpphibernate_make_id (&derived1::derived1_id), | |||||
| cpphibernate_make_field (derived1, test1_data), | |||||
| cpphibernate_make_field (derived1, enum_data) | |||||
| ), | |||||
| cpphibernate_make_table_name( | |||||
| tbl_derived2, | |||||
| derived2, | |||||
| 12, | |||||
| cpphibernate_make_id (&derived2::derived2_id), | |||||
| cpphibernate_make_field (derived2, test2_nullable), | |||||
| cpphibernate_make_field (derived2, test2_ptr_u), | |||||
| cpphibernate_make_field (derived2, test2_ptr_s) | |||||
| ), | |||||
| cpphibernate_make_table_name( | |||||
| tbl_derived3, | |||||
| derived3, | |||||
| 13, | |||||
| cpphibernate_make_id (&derived3::derived3_id), | |||||
| cpphibernate_make_field (derived3, test3_list), | |||||
| cpphibernate_make_field (derived3, test3_vector) | |||||
| ), | |||||
| cpphibernate_make_table_name( | |||||
| tbl_dummy_id, | |||||
| dummy_id, | |||||
| 14, | |||||
| cpphibernate_make_temp_id (dummy_id, ::cpphibernate::uuid), | |||||
| cpphibernate_make_field (dummy_id, data) | |||||
| ), | |||||
| cpphibernate_make_table_name( | |||||
| tbl_dummy_owner, | |||||
| dummy_owner, | |||||
| 15, | |||||
| cpphibernate_make_id (&dummy_owner::id), | |||||
| cpphibernate_make_field (dummy_owner, dummies) | |||||
| ), | |||||
| cpphibernate_make_table_name( | |||||
| tbl_double_usage_item, | |||||
| double_usage_item, | |||||
| 16, | |||||
| cpphibernate_make_id (&double_usage_item::id), | |||||
| cpphibernate_make_field (double_usage_item, data) | |||||
| ), | |||||
| cpphibernate_make_table_name( | |||||
| tbl_double_usage, | |||||
| double_usage, | |||||
| 17, | |||||
| cpphibernate_make_id (&double_usage::id), | |||||
| cpphibernate_make_field (double_usage, single_item), | |||||
| cpphibernate_make_field (double_usage, multiple_items) | |||||
| ), | |||||
| cpphibernate_make_table_name( | |||||
| tbl_double_usage_wrapper, | |||||
| double_usage_wrapper, | |||||
| 18, | |||||
| cpphibernate_make_id (&double_usage_wrapper::id), | |||||
| cpphibernate_make_field (double_usage_wrapper, double_usage) | |||||
| ) | |||||
| ); | |||||