7#include <userver/utils/meta.hpp>
9#include <userver/storages/postgres/detail/is_decl_complete.hpp>
10#include <userver/storages/postgres/io/io_fwd.hpp>
11#include <userver/storages/postgres/io/traits.hpp>
13USERVER_NAMESPACE_BEGIN
28inline constexpr bool kIsMappedToSystemType = IsMappedToSystemType<T>::value;
34inline constexpr bool kIsMappedToUserType = IsMappedToUserType<T>::value;
38struct IsMappedToArray;
40inline constexpr bool kIsMappedToArray = IsMappedToArray<T>::value;
43template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
49template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
57template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
66template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
82inline constexpr bool kIsCompatibleContainer = IsCompatibleContainer<T>::value;
85inline constexpr bool kIsFixedSizeContainer = meta::kIsFixedSizeContainer<T>;
89template <
typename T,
typename Enable = USERVER_NAMESPACE::
utils::
void_t<>>
102struct ContainerFinalElement;
107struct FinalElementImpl {
112struct ContainerFinalElementImpl {
113 using type =
typename ContainerFinalElement<
typename T::value_type>::type;
119struct ContainerFinalElement
120 : std::conditional_t<kIsCompatibleContainer<T>, detail::ContainerFinalElementImpl<T>, detail::FinalElementImpl<T>> {
124using ContainerFinaleElementType =
typename ContainerFinalElement<T>::type;
131template <
typename Container>
132constexpr bool EnableContainerMapping() {
133 if constexpr (!
traits::kIsCompatibleContainer<Container>) {
136 return traits::kIsMappedToPg<
typename traits::ContainerFinalElement<Container>::type>;
143struct IsMappedToArray : BoolConstant<detail::EnableContainerMapping<T>()> {};
147template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
155template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
164template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
165struct CanClear : std::false_type {};
173auto Inserter(T& container) {
174 return meta::Inserter(container);
179struct RemoveTupleReferences;
181template <
typename... T>
182struct RemoveTupleReferences<std::tuple<T...>> {
183 using type = std::tuple<std::remove_reference_t<T>...>;
188template <
typename... T>
192struct AddTupleConstRef;
194template <
typename... T>
195struct AddTupleConstRef<std::tuple<T...>> {
196 using type = std::tuple<std::add_const_t<std::add_lvalue_reference_t<std::decay_t<T>>>...>;
199template <
typename Tuple>
200struct TupleHasParsers;
202template <
typename... T>
203struct TupleHasParsers<std::tuple<T...>> : std::bool_constant<(HasParser<std::decay_t<T>>::value && ...)> {};
205template <
typename Tuple>
206struct TupleHasFormatters;
208template <
typename... T>
209struct TupleHasFormatters<std::tuple<T...>> : std::bool_constant<(HasFormatter<std::decay_t<T>>::value && ...)> {};