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<>>
51template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
59template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
68template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
84inline constexpr bool kIsCompatibleContainer = IsCompatibleContainer<T>::value;
87inline constexpr bool kIsFixedSizeContainer = meta::kIsFixedSizeContainer<T>;
91template <
typename T,
typename Enable = USERVER_NAMESPACE::
utils::
void_t<>>
104struct ContainerFinalElement;
109struct FinalElementImpl {
114struct ContainerFinalElementImpl {
115 using type =
typename ContainerFinalElement<
typename T::value_type>::type;
121struct ContainerFinalElement
122 : std::conditional_t<kIsCompatibleContainer<T>,
123 detail::ContainerFinalElementImpl<T>,
124 detail::FinalElementImpl<T>> {};
127using ContainerFinaleElementType =
typename ContainerFinalElement<T>::type;
134template <
typename Container>
135constexpr bool EnableContainerMapping() {
136 if constexpr (!
traits::kIsCompatibleContainer<Container>) {
139 return traits::kIsMappedToPg<
140 typename traits::ContainerFinalElement<Container>::type>;
147struct IsMappedToArray : BoolConstant<detail::EnableContainerMapping<T>()> {};
151template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
160template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
170template <
typename T,
typename = USERVER_NAMESPACE::
utils::
void_t<>>
181auto Inserter(T& container) {
182 return meta::Inserter(container);
187struct RemoveTupleReferences;
189template <
typename... T>
190struct RemoveTupleReferences<std::tuple<T...>> {
191 using type = std::tuple<std::remove_reference_t<T>...>;
196template <
typename... T>
200struct AddTupleConstRef;
202template <
typename... T>
203struct AddTupleConstRef<std::tuple<T...>> {
204 using type = std::tuple<
205 std::add_const_t<std::add_lvalue_reference_t<std::decay_t<T>>>...>;
208template <
typename Tuple>
209struct TupleHasParsers;
211template <
typename... T>
212struct TupleHasParsers<std::tuple<T...>>
213 : std::bool_constant<(HasParser<std::decay_t<T>>::value && ...)> {};
215template <
typename Tuple>
216struct TupleHasFormatters;
218template <
typename... T>
219struct TupleHasFormatters<std::tuple<T...>>
220 : std::bool_constant<(HasFormatter<std::decay_t<T>>::value && ...)> {};